我收到以下错误:
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时,则出现上述错误。
char* str = malloc(sizeof (strlen(tribe_name) + 1));
sizeof (strlen(tribe_name) + 1)
的值为sizeof(int)
,因为sizeof
得出表达式类型的对象表示的字节大小。
由于strlen
的返回类型是size_t
类型,并且1
是int
,并且按照大多数规则,size_t
值将在计算表达式之前转换为int
,因此,结果(strlen(tribe_name) + 1)
的类型为int
。
int
在大多数现代的32位系统上都是8字节长。
在8个字节中,您只能存储7个字符的字符串以及所需的以字符串结尾的空字符。
如果您尝试在该内存中存储超过7个字符的字符串,则会超出分配的内存范围写入,这是错误的。
应为
char* str = malloc(sizeof(char) * (strlen(tribe_name) + 1));