分段故障11,坏变量?

时间:2014-06-01 19:32:31

标签: c segmentation-fault

当我编译源文件时,我收到一个分段错误: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是一个全局变量。有什么问题?

1 个答案:

答案 0 :(得分:0)

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

你拨打delete(currentNode->value);但是value不是int?至少,这就是你在swap的实现中对待它的方式。如果是int,那么您要删除

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

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


作为附言:虽然通过随意检查代码,即使没有调试器,这种错误也很容易找到,花时间学习如何使用调试器。这对于想要编程的任何人来说都是一项关键技能,它会带来红利:它不仅可以帮助你追踪错误,还可以让你更深入地了解正在发生的事情,让你变得更好程序员在这个过程中。