【问题标题】:Very strange... Segmentation Fault because of NAME of int?很奇怪... 由于 int 的 NAME 导致的分段错误?
【发布时间】:2013-02-18 23:48:59
【问题描述】:

当我运行这段代码时,我遇到了分段错误,但如果我将 result 更改为 blah 它运行得很好。我已经尝试了有符号/无符号、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;
}

【问题讨论】:

  • 可能是内存损坏
  • 重启后这段代码是否仍然失败?另外,您的设置/编译器等是什么?
  • 在您的代码中,您正在执行一个非常长的字符串比较 strncmp(key,table[i],length),其中长度为 1024。您确定 keytable 是至少 1024 个字符的字符串吗?
  • 分段错误在哪里准确?
  • @Ganesh:strncmp 停止在终止零或达到请求的长度时 - 无论先到。所以,如果字符串是以零结尾的,那么如果它们短于 1024 就可以了。

标签: c


【解决方案1】:

if (strncmp(key,table[i],length)==0) 由于循环在i &lt; tableCount 时继续,因此可以保证 i 在 table 的范围内,但不能保证 table[i] 是 strncmp 期望的指向字符串的指针。我建议if (table[i] != NULL &amp;&amp; strncmp(key, table[i], length) == 0) ... 来解决这种未定义的行为。

当程序使用未定义的行为时,它可能会以非常奇怪的方式失败。

不保证i+1table 指向的数组范围内。为了解决未定义的行为,请实施适当的边界检查。

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

【讨论】:

  • 好的。这里发生了一些非常奇怪的事情。我更改为if (table[i]!=NULL &amp;&amp; strncmp(key,table[i],length)==0 并在result = (unsigned int) atoi(table[i+1]) 上方添加了if (table[i+1]==NULL) {continue;},但仍然有错误...如果我将分配注释掉,它不会崩溃。
  • @user2085142 我已经介绍过:您需要边界检查以确保 i+1 是表的有效索引。表的有效索引为 0 ... tableCount-1。当 i == tableCount-1 时,i+1 是 tableCount,它在那些有效索引之外。因此,未定义的行为和崩溃崩溃。
  • 非常感谢您的帮助。我现在觉得很荒谬,因为它实际上是在返回正确的结果并在其他地方崩溃。我想我昨天需要休息一下!
  • @aomimezura 这发生在我们最好的人身上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2018-01-02
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多