当我运行此代码时,我遇到了分段错误,但如果我将result
更改为blah
则运行正常。我已经尝试了signed / unsigned,sscanf / atoi,initializing / not,int / char的每个排列,甚至直接使用指针而不是参数。
我知道这是char *不是null。唯一的变化是变量的名称。
有谁知道是什么原因造成的?这简直太奇怪了......
编辑:此文件的范围内没有其他变量。
编辑:它似乎与return
有关。如果我返回使用的值,我会收到错误,但是控件在崩溃之前永远不会离开函数。
unsigned int getHashValue(char* key, char** table, unsigned int tableCount)
{
int i = 0;
//unsigned int length = strnlen(key,1024);
unsigned int length = 1024;
printf("Hashing...\n");
unsigned int blah;
int result;
for (i=0;i<tableCount;i+=2)
{
printf("i: %i\n",i);
if (strncmp(key,table[i],length)==0)
{
printf("found %s\n", table[i+1]);
/*sscanf()*/
result = (unsigned int) atoi(table[i+1]);
//blah = atoi(table[i+1]);
//sscanf(table[i+1],"%i",&result);
return result;
}
}
printf("..done\n");
return 0;
}
答案 0 :(得分:0)
if (strncmp(key,table[i],length)==0)
由于循环在i < tableCount
期间继续,因此可以保证i在表的范围内,但不能保证table[i]
是指向strncmp的字符串的指针预计。我建议if (table[i] != NULL && strncmp(key, table[i], length) == 0) ...
以解决这种未定义的行为。
当程序使用未定义的行为时,它可能会以非常奇怪的方式失败。
无法保证i+1
在table
指向的数组的范围内。为了解决未定义的行为,请执行适当的边界检查。
此外,似乎无法保证它指向一个字符串。考虑printf("found %s\n", table[i+1]);
在i+1
的范围内table
可能会执行的操作,但table[i+1]
为NULL。 atoi也是如此。