【发布时间】:2013-11-28 20:45:57
【问题描述】:
我正在 c 中创建一个基于链表的程序,其中每个节点(结构)都包含一个整数和一个指向下一个节点的指针。
在添加新节点和删除旧节点时,我使用动态分配 (malloc) 和释放 (free)。
当一个节点被删除时,一个名为 delete 的函数会被调用。
我发现程序有时会在调用此删除函数时崩溃,我知道它与方法中的指针有关,但我不知道代码中的位置(行号)以及为什么会发生这种情况。
我习惯了 Java 等高级语言,我习惯于通过在方法中的某些位置放置打印语法来解决问题,只是为了显示它崩溃的位置。 我想我可以用 c 和指针做同样的事情,因为据我所知,我相信代码是从上到下读取的,即 1、2、3、4 等等。 (也许中断处理程序的行为方式不同?)
所以在这个名为 delete 的函数中,到目前为止,我已经把这个 printf() 放在了 delete 函数的最开始处——但程序还是崩溃了。 em>
所以我的问题 - 是否真的有可能它在删除函数中的某些语法(例如当我循环指针时)导致崩溃,甚至 printf() 都没有打印? em>
当我认为程序是从下到下执行时,我错了吗 - 即 1, 2, 3 ....
你可以在delete-function的最开始设置我的printf-function
顺便说一句 - 当我从 Windows 收到这条神秘的崩溃消息时,我该如何解决这个问题?看位图!!
求解答!!!
int delete(int data) {
printf("IN THE BEGINNING OF DELETE!!!");
int result = 0;
if (queueref.last != NULL) {
node *curr_ptr;
node *prev_ptr;
node *temp_ptr;
if (queueref.first->data == data) {
temp_ptr = queueref.first;
queueref.first = queueref.first->next;
destroy_node(temp_ptr);
result = 1;
if (queueref.first == NULL) {
queueref.last = NULL;
puts("queue is now empty!!!");
}
} else {
prev_ptr = queueref.first;
curr_ptr = queueref.first->next;
printf("prev_ptr: %d\n", prev_ptr);
printf("curr_ptr: %d\n", curr_ptr);
while(curr_ptr != NULL) {
if (curr_ptr->data == data) {
result = 1;
if (curr_ptr->next != NULL) {
temp_ptr = curr_ptr;
destroy_node(temp_ptr);
prev_ptr->next = curr_ptr->next;
} else {
temp_ptr = curr_ptr;
queueref.last = prev_ptr;
prev_ptr->next = NULL;
destroy_node(temp_ptr);
}
}
curr_ptr = curr_ptr->next;
prev_ptr = prev_ptr->next;
}
}
}
return result;
}
【问题讨论】: