当我编译源文件时,我收到一个分段错误: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是一个全局变量。有什么问题?
答案 0 :(得分:0)
您的代码存在一些问题,但让我们关注可能导致您看到崩溃的问题:
你拨打delete(currentNode->value);
但是value
不是int?至少,这就是你在swap
的实现中对待它的方式。如果是int
,那么您要删除
也许您的意图是删除currentNode
。但即使这是错误的:请注意,虽然这会成功删除currentNode
(假设它当然已分配new
),但它不会更改头指针。它将继续指向它之前指向的位置:您刚刚调用的内存删除。
所以,无论哪种方式,你都搞砸了,你应该重新思考你在那个循环中做了什么。
作为附言:虽然通过随意检查代码,即使没有调试器,这种错误也很容易找到,请花时间学习如何使用调试器。这对于想要编程的任何人来说都是一项关键技能,它会带来红利:它不仅可以帮助你追踪错误,还可以让你更深入地了解正在发生的事情,让你变得更好程序员在这个过程中。