2014-12-10 13 views
1

32 바이트 문자열의 처음 16 바이트를 dest으로 복사하려고합니다.C 메모리가 겹 칩니 까?

unsigned char src[32] = "HELLO-HELLO-HELLO-HELLO-HELLO-12"; 
unsigned char dest[16]; 

memcpy(dest, src, 16); // COPY 

printf("%s\n", src); 
printf("%lu\n", strlen(src)); 

printf("%s\n", dest); 
printf("%lu\n", strlen(dest)); 

출력은 난 단지 destHELLO-HELLO-HELL을받을 것으로 예상 않은 다음

HELLO-HELLO-HELLO-HELLO-HELLO-12 
32 
HELLO-HELLO-HELLHELLO-HELLO-HELLO-HELLO-HELLO-12 
48 

입니다. dest의 첫 번째 16 바이트는 실제로 예상 된 결과를 포함합니다.

실제로 dest 개가 실제로 보유 할 수있는 것보다 많습니까? 길이가 16+32=48 인 이유는 무엇입니까? 의 처음 16 바이트 만 dest으로 복사 할 수 있습니까?

+2

16 자 문자열을 복사하려면 17 자 버퍼가 필요하며 마지막 문자가 '\ 0'인지 확인하십시오. 무슨 일이 벌어 지는지는 가비지를 생성하는 종결되지 않은 문자열에서의 고전적인 인쇄입니다 (이 경우 src 문자열의 나머지 문자입니다). – Petesh

+0

[string tag-wiki] (https://stackoverflow.com/tags/string/info)를보십시오. – Deduplicator

+0

memcpy 대신 strcpy 또는 strncpy를 사용하고 다른 언어의 문자열과 같은 문자열이 아닌 null로 끝나는 char 배열의 C 문자열을 읽습니다. – Matt

답변

4

dest에 할당 된 16 바이트는 후행 NULL ('\ 0')에 대한 바이트를 포함해야합니다. 16 바이트를 썼기 때문에 널이 아닌 종료 문자열이 있습니다.

현재 사용중인 컴퓨터의 스택이 특정 방식으로 구성되어 있으므로 dest 끝 부분을 지난 다음 src를 인쇄합니다.

따라서 16 바이트를 복사하려면 17을 할당하여 후행 null에 대한 공간을 남겨두고 초기화하십시오.

unsigned char dest[17]={0}; 

얼터너티브, 그것을 복사 한 후, 널 (null)를 종료 : 당신은 문자열이 널 (null) 종료된다는 사실을 차지하지 않는

memcpy(dest, src, 16); // COPY 
dest[16]='\0'; 
+1

가짜 초기화는 성능을 저하시키는 좋은 방법입니다. 버퍼가 너무 크지 않기 때문에 초기화 작업을 17 번만 수행하면되므로이 경우 나쁘지 않습니다. – Deduplicator

+0

18 초! 네가 이겼다. – KirkSpaziani

+1

* 스퓨리어스 *. . . 나는 그것이 당신이 생각하는 것을 의미한다고 생각하지 않습니다. –