gpt4 book ai didi

C 程序段错误

转载 作者:太空宇宙 更新时间:2023-11-04 02:44:51 25 4
gpt4 key购买 nike

我很难在类项目的一段代码中找到段错误(这部分未评分)。我正在为操作系统类实现一个队列,但在添加函数中遇到了段错误。

void AddQueue(QElem * head, QElem * item) {
printf("WHERE\n");
if(head == NULL){
printf("THE\n");
head = item;
//item->next = item;
//item->prev = item;
}
else{
printf("$^&*\n");
(head->prev)->next = item;
printf("ARE\n");
item->prev = (head->prev);
printf("YOU\n");
item->next = head;
printf("FAILING\n");
head->prev = item;
}
printf("!?!?!?\n");
}

我有一个从不同类调用的测试函数...

void TestAddQueue()
{
printf("********************************************\n");
printf("Begin testing the add test function\n");
printf("********************************************\n");

QElem * queue;
InitQueue(queue);


for(int i = 0; i < 10; i++)
{
printf("Adding element %d\n", i+1);
QElem * newElem = NewItem();
printf("Changing payload value\n");
newElem->payload = i+100;
printf("Adding to the queue\n");
AddQueue(queue, newElem);
printf("Item added, payload value = %d\n", queue->payload);
printf("The previous payload = %d\n", queue->prev->payload);

}
for(int i = 0; i < 10; i++)
{
printf("Rotating list", i+1);
RotateQ(queue);
printf("Printing element %d\n", i+1);
printQElem(queue);
}
}

这是 NewItem 函数...

QElem * NewItem()
{
// just return a new QElem struct pointer on the heap
QElem * newItem = calloc(1,sizeof(QElem));
newItem->next = newItem;
newItem->prev = newItem;
newItem->payload = -1;
return newItem;
}

...这是运行程序的输出...

********************************************
Begin testing the add test function
********************************************
Adding element 1
Changing payload value
Adding to the queue
WHERE
THE
!?!?!?
Segmentation fault

现在传递到 add 函数的头指针应该是 NULL,因为它发送到初始化函数,该函数只是将指针的值设置为 NULL,所以我认为这不会导致我的问题。

我的猜测是下一行是导致问题的原因......

printf("Item added, payload value = %d\n", queue->payload);

可能当我尝试获取负载值时,我尝试访问的结构不再存在,或者队列指针以某种方式移动到无效空间。任何正确方向的反馈或插入将不胜感激。

旁注:这是在 Unix 服务器环境 (bash) 中编译的,目前我无法访问 IDE 来调试和查看变量。

最佳答案

在 C 中,参数是按值 传递的,这意味着它们是复制的。更改副本当然不会更改原件。

所以在 AddQueue 函数中,变量 head 是一个副本,你可以随意改变,你原来的变量传递给函数的值不会发生任何变化。

要能够更改参数,您需要按引用传递,C 没有,但可以通过使用指针来模拟。这当然意味着要通过引用传递指针,您必须传递指向该指针的指针。


所以对于你的代码来说,它就像

void AddQueue(QElem ** head, QElem * item) {
if(*head == NULL){
*head = item;
}
...
}

...

AddQueue(&queue, newElem);

上述更改首先使 AddQueue 接受指向 QElem 的指针,从而使其模拟按引用传递的习惯用法。要使用原始指针,您可以使用取消引用运算符 *,它会为您提供指针指向的值(在本例中为原始指针)。然后要实际将指针传递给指针,您必须在指针变量上使用寻址运算符 &

关于C 程序段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28473209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com