首页 文章

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

提问于
浏览
0

当我运行此代码时,我得到一个分段错误,但如果我将 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

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

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

相关问题