我是valgrind的新手,我想弄清楚为什么它会给我带来以下错误:
==9976== Invalid write of size 1
==9976== at 0x4C32E0D: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9976== by 0x109907: duplicate (parse.c:22)
==9976== by 0x1099AB: parse (parse.c:84)
==9976== by 0x108E8E: load_employees (emp.c:245)
==9976== by 0x108B62: main (rpt.c:28)
==9976== Address 0x522fe59 is 0 bytes after a block of size 9 alloc'd
==9976== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9976== by 0x1098F0: duplicate (parse.c:20)
==9976== by 0x1099AB: parse (parse.c:84)
==9976== by 0x108E8E: load_employees (emp.c:245)
==9976== by 0x108B62: main (rpt.c:28)
我的功能:
static char *duplicate( const char *str ) {
int len = sizeof( str );
char *buf = (char *) malloc( (len + 1)* sizeof(*buf));
strcpy( buf, str );
return( buf );
}
parse.c第22行是“return(buf);”
sizeof( str )
在大多数现代架构上都是4或8(在你的,它似乎是8,因为valgrind输出表明分配了9个字节),无论它指向的字符串中有多少个字符。 sizeof
将告诉你存储指针本身所需的大小,而不是它指向的字符串的长度。
相反,使用:
size_t len = strlen(str);
计算你传递的NUL
终止字符串的长度。
顺便说一句,许多系统提供strdup,它完全符合你的duplicate
功能应该做的。