2016-11-12 4 views
-1

그래서 쉽게 할당하고 할당 된 메모리를 확보하려고했지만 valgrind가 이러한 오류를 씁니다.할당시 유효하지 않은 읽기/쓰기 크기

C에서
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int main() 
{ 

    char* area=(char*)malloc(3); 
    strcpy(area, "lal"); 
    printf("%s\n",area); 
    free(area); 

return 0; 
} 

Invalid write of size 4 
==2728== at 0x10873A: main (in /home/david/po1/a.out) 
==2728== Address 0x5200040 is 0 bytes inside a block of size 3 alloc'd 
==2728== at 0x4C2CB3F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==2728== by 0x108731: main (in /home/david/po1/a.out) 
==2728== 

답변

2

문자열 단일 0x00 바이트 널 종결 모든 엔드. 이것은 자동으로 모든 문자열 리터럴의 끝에 추가됩니다, 그래서 당신은 area"lal"를 복사 할 때, 당신은 실제로 Valgrind의 불평 이유는 4 바이트, 'l', 'a', area-'l' & '\0'을 복사했다.

C 문자열을 다룰 때마다 항상 널 종결자를위한 충분한 공간이 있는지 확인하십시오!

+1

문자열이''strcpy (area, "lal")와 같은 큰 따옴표로 묶여있을 때 특히 그렇습니다. – ron

+0

'strcpy()'는 실제로 널 종결자를 복사합니다. 복사를 멈출 때를 알려주는 널 종결 자! 이런 이유로'strcpy()'를 사용하는 것은 일반적으로 안전하지 않은 것으로 간주됩니다. –

+1

@AndrewDunn 길이를 먼저 확인하거나 길이를 알고 있으면 완벽하게 안전합니다. –