0

当我运行这段代码时,我得到一个分段错误,但如果我改变resultblah运行得很好。我已经尝试了有符号/无符号、sscanf/atoi、初始化/非、int/char 的所有排列,甚至直接使用指针而不是作为参数。

我知道这是 char* 不为空。唯一的变化是变量的名称。

有谁知道这是什么原因?简直太诡异了……

编辑:此文件的范围内没有其他变量。

编辑:它似乎与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;
}
4

1 回答 1

0

if (strncmp(key,table[i],length)==0)由于循环继续 while i < tableCount,因此可以保证 i 在 table 的范围内,但不能保证这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在 的范围内tabletable[i+1]为 NULL 会发生什么。atoi 也是如此。

于 2013-02-19T00:30:27.937 回答