所以我尝试轻松分配,然后释放分配的内存,但valgrind会写出这些错误。
#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==
答案 0 :(得分:2)
在C中,字符串都以空终止符结束,这是一个0x00
字节。这会自动添加到所有字符串文字的末尾,因此当您将"lal"
复制到area
时,实际上是在复制4个字节,'l'
,'a'
,{{1 }&amp; 'l'
到'\0'
,这就是Valgrind抱怨的原因。
在处理C字符串时,始终确保有足够的空间容纳空终止符!