带有strcpy的Valgrind错误:读取的大小为1无效

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

我收到以下错误:

Invalid read of size 1 at 0x4008F4: isNameValid (elections.c:76)

并且似乎错误是由strcpy函数引起的。但是我不知道为什么会出错,因为没有它我的代码将无法正确运行。那么我该如何解决呢?

最小示例

bool isNameValid(const char *tribe_name) {
    char *str = malloc(sizeof (strlen(tribe_name) + 1));
    if (!str) {
        return false;
    }
    if (!strcpy(str, tribe_name)) {
        free(str);
        return false;
    }
}

PS:当tribe_name的字符数少于7个时,它可以正常工作,但是当我输入的字符数大于7时,则出现上述错误。

c
1个回答
0
投票
char* str = malloc(sizeof (strlen(tribe_name) + 1));

sizeof (strlen(tribe_name) + 1)的值为sizeof(int),因为sizeof得出表达式类型的对象表示的字节大小。

由于strlen的返回类型是size_t类型,并且1int,并且按照大多数规则,size_t值将在计算表达式之前转换为int,因此,结果(strlen(tribe_name) + 1)的类型为int

int在大多​​数现代的32位系统上都是8字节长。

在8个字节中,您只能存储7个字符的字符串以及所需的以字符串结尾的空字符。

如果您尝试在该内存中存储超过7个字符的字符串,则会超出分配的内存范围写入,这是错误的。


应为

char* str = malloc(sizeof(char) * (strlen(tribe_name) + 1));
© www.soinside.com 2019 - 2024. All rights reserved.