2016-11-12 50 views
-1

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

回答

2

在C中,所有的字符串一端与空终止,这是一种单一0x00字节。这是自动添加到所有字符串文字的结尾,所以当你复制"lal"area,你实际上是复制4个字节,'l''a''l' & '\0'area,这就是为什么Valgrind的抱怨。

无论何时处理C字符串,始终确保您有足够空间存在空终止符!

+1

当一个字符串用双引号引起来时,例如他在'strcpy(area,“lal”);' – ron

+0

'strcpy()'实际上总是会复制空终止符,因为它使用空终止者知道何时停止复制!正因为如此,使用'strcpy()'通常被认为是不安全的。 –

+1

@AndrewDunn如果你先检查长度或知道长度,那么它是完全安全的 –