为什么valgrind给我一个malloc错误?

问题描述 投票:0回答:1

我是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);”

c
1个回答
3
投票

sizeof( str )在大多数现代架构上都是4或8(在你的,它似乎是8,因为valgrind输出表明分配了9个字节),无论它指向的字符串中有多少个字符。 sizeof将告诉你存储指针本身所需的大小,而不是它指向的字符串的长度。

相反,使用:

size_t len = strlen(str);

计算你传递的NUL终止字符串的长度。

顺便说一句,许多系统提供strdup,它完全符合你的duplicate功能应该做的。

© www.soinside.com 2019 - 2024. All rights reserved.