【问题标题】:Segmentation Fault 11, bad variable?分段错误 11,变量错误?
【发布时间】:2014-06-01 19:32:31
【问题描述】:

当我编译一个源文件时,我收到一个分段错误:11 错误。我已经能够缩小范围,并且我知道错误来自这个函数:

struct drecord { /* use this struct for double-linked lists */
int value;
struct drecord *previous;
struct drecord *next;
};

void sort()
{

struct drecord *currentNode;
struct drecord *end;
for(end=head->previous; end!=NULL && end!=head; end=end->previous)
{
    for(currentNode = head; currentNode != NULL && currentNode != end; currentNode = currentNode->next)
    {


        if (currentNode->value > currentNode->next->value)
        {
            swap(currentNode, currentNode->next);
        }

        currentNode = currentNode->next;
    }
}
printf("\n");

printf("%d", numElements);
while(numElements > 0)
{
    currentNode = head;
    printf("Sorted elements: %d", currentNode->value);
    delete(currentNode->value);
    numElements = numElements - 1;
}

}

void swap(struct drecord *drecord1, struct drecord *drecord2)
{
int aux = drecord1->value;
drecord1->value = drecord2->value;
drecord2->value = aux;
}

更具体地说,我认为它来自 printf("\n") 之后的代码部分,因为 printf("\n") 有效,但过去没有任何效果。我曾认为这是变量 numElements 的问题,但我在另一个源文件中有相同的完全相同的代码,它工作得很好。 numElements 是一个全局变量。怎么了?

【问题讨论】:

  • 使用调试器准确识别导致段错误的行,然后向后工作。
  • 是时候在调试器下运行代码了。 Get 会准确地告诉你有问题的指令在哪里。
  • 如果 currentNode->next 为 NULL 或 end,那么 currentNode->next->value 会是什么?
  • 我在使用调试器时遇到问题。该函数对链表进行正确排序。问题是当我试图打印出链表时;这就是发生分段错误的时候。
  • 1) swap() 可疑。期待像swap(&currentNode, &currentNode->next); 这样的东西会很高兴显示swap()。 2) 在不影响head 的情况下进行交换可能是错误的。 3) 显示struct drecord 定义。

标签: c segmentation-fault


【解决方案1】:

您的代码存在一些问题,但让我们关注可能导致您看到的崩溃的问题:

你调用delete(currentNode->value); 但不是value 一个int?至少,这就是您在实现swap 时的处理方式。如果是int,那么您究竟要删除什么?

也许您的意图是删除currentNode,而不是。但即使这样也是错误的:请注意,虽然这将成功删除currentNode(当然假设它是用new 分配的),但它不会改变头指针。它将继续指向它之前指向的位置:您刚刚调用删除的内存。

所以,无论哪种方式,你都搞砸了,你应该重新考虑在那个循环中你在做什么。


后记:尽管通过随意检查代码,即使没有调试器也很容易发现这种错误,花时间学习如何使用调试器。对于想要编程的任何人来说,这是一项至关重要的技能,它会带来好处:它不仅可以帮助您追踪错误,而且可以让您更深入地了解正在发生的事情并让您变得更好程序员在处理中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-25
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多