我的程序正在生成分段错误

时间:2014-11-30 21:36:46

标签: c segmentation-fault

此方法正在生成分段错误。该方法旨在返回列表的指定位置的值。该列表是多项式列表。它应该返回一个多项式。我尝试使用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修复错误并且不再分配内存后,这段代码第一次运行正常,但如果我第二次运行它会出错#/ p>

Edit2:

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

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

4 个答案:

答案 0 :(得分:3)

for (j == 1;j < i;j++)

应该是

for (j = 1; j < i; j++)

答案 1 :(得分:2)

  1. NULL
  2. 进行llist* node检查
  3. 无需分配llist* current [llist* current = malloc(sizeof(llist));]
  4. for (j == 1;j < i;j++)应为for (j = 0;j < i;j++)
  5. 在解除引用之前
  6. ,在NULL
  7. 中查看current current->next;

    注意:不要强制转换malloc()

    的返回值

答案 2 :(得分: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。我不知道他们的意思所以我在我的函数中只使用了一种类型llink。至少它指出了如何编写函数的正确方向。:)

答案 3 :(得分:1)

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

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

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