memcpy와memmove
먼저 man의 결과를 봅시다.
NAME memcpy - copy memory area
SYNOPSIS #include
void *memcpy(void *dest, const void *src, size_t n);
DESCRIPTION The memcpy() function copies n bytes from memory area src to memory area dest. The memory areas should not overlap. Use memmove(3) if the memory areas do overlap.
NAME memmove - copy memory area
SYNOPSIS #include
void *memmove(void *dest, const void *src, size_t n);
DESCRIPTION The memmove() function copies n bytes from memory area src to memory area dest. The memory areas may overlap: copying takes place as though the bytes in src are first copied into a temporary array that does not overlap src or dest, and the bytes are then copied from the temporary array to dest.두 가지 가장 큰 차이점은 src와dest 구역이 중첩된 상황을 볼 수 있으며, 중첩될 때memmove를 사용할 수 있다.
먼저 memcpy 코드를 보십시오.
1: void *memcpy(void *dest, const void *src, size_t n)
2: {
3: void* ret = dest;
4:
5: //
6: while (n--)
7: {
8: *(char*)(dest++) = *(char*)(src++);
9: }
10:
11: return ret;
12: }
겹치는 경우:
1.dest 주소는 src보다 낮고 중첩되지 않는memcpy와 유사합니다. 예를 들어 다음과 같습니다.
1: char a[] = "helloworld";
2: printf("%s
", a);
3: memcpy(a, a+2, 3);
4: printf("%s
", a);
a[2]부터 세 글자를 복사하고 a[0]에서 순서대로 내려놓으세요.
출력:lloloworld
2.src 주소는dest 주소보다 낮고memcpy 방식으로 복사하면 오류가 발생합니다. 예를 들어 다음과 같습니다.
1: char a[] = "helloworld";
2: printf("%s
", a);
3: memcpy(a+2, a, 3);
4: printf("%s
", a);
원래 뜻은 a[0]부터 세 글자를 복사하고 a[2]에서 순서대로 내려놓으면 hehelworld
하지만 출력: hehehworld
올바른 코드:
1: void *memmove(void* dest, const void *src, size_t n)
2: {
3: void* ret = dest;
4:
5: if (dest<=src || (char*)dest>= ((char*)src + n))
6: {
7: // dest src,
8: while (n--)
9: {
10: *(char*)(dest++) = *(char*)(src++);
11: }
12: }
13: else
14: {
15: //src dest
16: // ,dest src
17: //
18: dest = (char*)dest + n - 1;
19: src = (char*)src + n - 1;
20: while (n--)
21: {
22: *(char*)(dest--) = *(char*)(src--);
23: }
24: }
25:
26: return ret;
27: }
이렇게 memove(a+2, a, 3)를 호출하는 것이 옳다.
출력:hehelworld
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.