【发布时间】:2013-10-31 15:49:03
【问题描述】:
我是一名初学C语言程序员,刚刚编写了一个涉及队列操作的练习题,在调试时,我遇到了以下场景:
代码示例 1:
int dequeue (struct queue_node * Q) {
struct queue_node * curr = Q->next;
if(!Q->next)
return -2;
else
{
int s = Q->next->v_no;
Q->next = curr->next;
free(curr);
return s;
}
}
代码示例2(相同的函数,稍作修改):
int dequeue (struct queue_node * Q) {
struct queue_node * curr = Q;
if(!curr->next)
return -2;
else
{
int s = curr->next->v_no;
Q->next = curr->next->next;
free(curr->next);
return s;
}
}
预定义的数据结构如下:
struct queue_node {
int v_no;
struct queue_node * next;
};
void enqueue (struct queue_node * Q , int s) {
struct queue_node * curr = Q;
while (curr->next)
curr = curr->next;
curr->next = malloc(sizeof(struct queue_node));
if(!curr->next)
exit(10); //No specific reason for errno 10, just wanted to exit
curr->next->v_no = s;
curr->next->next = NULL;
}
问题: 场景 1 中的代码允许程序成功执行并输出预期的答案,但根据我的理解,场景 2 中的代码也尝试实现相同的目标,但给出了分段错误。有人可以指出我的理解是否有缺陷,或者我的代码本身有什么问题吗??
谢谢!
【问题讨论】:
-
请修正代码格式。编辑器为此提供了按钮和快捷键 (Ctrl+K)。
-
您确定要删除
->next处的项目吗? -
记得最终接受an的答案——不一定是我的,但应该有人从中得到一些因果报应。 :)
-
@Nikos:感谢您指出这一点