2012-09-14 3 views
2

내가 Valgrind의를 사용하고 있지만, 어떤 이유로 나는 코드가 영향 C.메모리 오류, strcpy를

에서 같은 크기의 두 개의 문자열로 간단한 문자열 사본을 사용하여 메모리 오류가 계속 is :

node->entry = (char*)malloc(strlen(string)*sizeof(char)); 
strcpy(node->entry, string); 

문자열은 char * string = "Hello There"입니다. 오류 : 도움말에 대한 크기 2

의 잘못된 쓰기
==2035== at 0xD494: memmove$VARIANT$sse42 (mc_replace_strmem.c:987) 
==2035== by 0x100001793: __inline_strcpy_chk (_string.h:94) 
==2035== by 0x100001699: createList (main.c:10) 
==2035== by 0x100001BE6: main (main.c:132) 
==2035== Address 0x10000c0fa is 10 bytes inside a block of size 11 alloc'd 
==2035== at 0xB823: malloc (vg_replace_malloc.c:266) 
==2035== by 0x100001635: createList (main.c:9) 
==2035== by 0x100001BE6: main (main.c:132) 

감사합니다!

+2

코드에 너무 많은 잡음이 있습니다. 'node-> entry = malloc (strlen (string) + 1)'이어야합니다. –

답변

4
malloc(strlen(string)*sizeof(char)); 

당신은 계정에 종료 '\0'을 복용하지 않습니다. 따라서 (strlen(string) + 1)이어야합니다.


사이드 참고 : 당신이 자신을 3 회 반복하지 않기 때문에

type *x; 
x = malloc(size * sizeof(*x)) 

훨씬 더 유지 보수

type *x; 
x = (type *)malloc(size * sizeof(type)); 

보다.

3

귀하의 코드가 파손되어

  1. 당신은 문자열 종료 문자위한 공간을 할당 할 필요가, 실패는 너무 비 할당 된 메모리에 strcpy() 쓰기를하고 버퍼 오버 플로우 버그의 원인이됩니다 할 수 있습니다.
  2. Don't cast the return value of malloc(), in C.
  3. 메모리에 쓰기 전에 할당이 성공했는지 확인해야합니다.

또한 sizeof (char)은 항상 1이므로 관련 할 필요가 없습니다.

node->entry = malloc(strlen(string) + 1); 

을하거나 위의 모든 결합하기 때문에 당신이 strdup()이있는 경우, 확인 : 그냥 사용합니다. 일반적인 경우

, @Shahbaz가 언급 한 바와 같이,이 유형의 이름을 반복하지 않도록하기 위해, 왼쪽 포인터를 역 참조의 결과에 sizeof 연산자를 사용하는 것이 좋습니다 : 또한

type *x; 
x = malloc(amount * sizeof *x); 

을 참고 sizeof은 함수가 아니며 인수가 유형 이름이고 괄호는 필자가 주장한 것처럼 피할 수있을 때만 필요합니다.