很奇怪...因为int的NAME而出现分段错误?

时间:2013-02-18 23:49:00

标签: c

当我运行此代码时,我遇到了分段错误,但如果我将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;
}

1 个答案:

答案 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+1table指向的数组的范围内。为了解决未定义的行为,请执行适当的边界检查。

此外,似乎无法保证它指向一个字符串。考虑printf("found %s\n", table[i+1]);i+1的范围内table可能会执行的操作,但table[i+1]为NULL。 atoi也是如此。