【问题标题】:My c program is generating a segmentation fault我的 c 程序正在生成分段错误
【发布时间】:2014-11-30 21:36:45
【问题描述】:

此方法正在生成分段错误。该方法旨在返回列表指定位置的值。该列表是多项式列表。它应该返回一个多项式。我尝试在它上面使用 gdb,但它只是告诉我它是什么方法。

llink* get_specific(llist* node)
{
    struct link * poly;
    int i;
    printf("Which polynomial do you want: ");
    scanf("%d",&i);
    llist* current;
    current = node;
    int j;
    llist* temp;
    for (j = 1;j < i;j++)
        current = current->next;
    poly = current->poly;
  return poly;
}

编辑:用 j 修复错误并且不再分配内存后,此代码第一次运行良好,但如果我第二次运行它会出现错误

编辑2:

 for (j = 1;j < i;j++)
        current = current->next;

当它访问for循环内的行时会导致分段错误。如果用户输入为 1,则运行正常,但如果是其他任何内容,则会出现故障

【问题讨论】:

  • 您的指针/malloc 使用不正常。您的调试器使用、scanf 等也不是...
  • Gdb 会告诉你确切的行号(和违规指令)。使用调试信息 (-g) 进行编译。
  • gdb 没有给我一个确切的行号,我用 -g.gdb 编译在 get_specific () 中给我返回 #0 0x08048c4d #1 0x08048df3 in main ()

标签: c segmentation-fault


【解决方案1】:

for (j == 1;j &lt; i;j++)

应该是

for (j = 1; j &lt; i; j++)

【讨论】:

    【解决方案2】:

    您的代码存在内存泄漏。

    例如你分配了一个节点但它没有被使用并且内存没有被释放

    llist* current = malloc(sizeof(llist));
    current = node;
    

    把函数写得更简单

    llink * get_specific( const llink *node )
    {
        size_t i;
    
        printf( "Which polynomial do you want: " );
        scanf( "%u", &i );
    
        while ( node != NULL && i-- ) node = node->next;
    
        return node;
    }
    

    您的代码中还有三种不同的类型:linkllinkllist。我不知道它们是什么意思,所以我在函数中只使用了一种类型的链接。至少它为您指明了如何编写函数的正确方向。:)

    【讨论】:

      【解决方案3】:
      1. 创建NULL 检查llist* node
      2. 无需分配llist* current [llist* current = malloc(sizeof(llist));]
      3. for (j == 1;j &lt; i;j++) 应该是 for (j = 0;j &lt; i;j++)
      4. 在解除引用之前,检查NULL 中的current current-&gt;next;

      注意:不要强制转换malloc()的返回值。

      【讨论】:

        【解决方案4】:

        您的代码存在几个问题。我怀疑分段错误是因为您没有初始化 j 变量。 for 循环中的初始化子句实际上是一个比较运算符。它可能应该是j = 1(或者可能是j = 0)而不是j == 1

        如果用户输入的数字超出列表末尾,也可能发生故障。您需要在循环中进行某种测试,以确保您不会越界。

        还值得注意的是,看起来您实际上并不需要那些 malloc 调用。您实际上似乎并没有使用您分配的内存(而且您也没有释放它,所以它会泄漏)。

        【讨论】:

          猜你喜欢
          • 2014-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-08
          • 1970-01-01
          • 2012-10-12
          相关资源
          最近更新 更多