【发布时间】: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