alloc时读取/写入的大小无效

时间:2016-11-12 01:02:38

标签: c malloc valgrind alloc

所以我尝试轻松分配,然后释放分配的内存,但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== 

1 个答案:

答案 0 :(得分:2)

在C中,字符串都以空终止符结束,这是一个0x00字节。这会自动添加到所有字符串文字的末尾,因此当您将"lal"复制到area时,实际上是在复制4个字节,'l''a',{{1 }&amp; 'l''\0',这就是Valgrind抱怨的原因。

在处理C字符串时,始终确保有足够的空间容纳空终止符!