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에 따라 라이센스가 부여됩니다.