【发布时间】:2021-02-10 04:30:13
【问题描述】:
我很好奇为什么将返回的指针分配给新的指针变量会导致分段错误?但是,将指针作为双指针传递给 pop() 函数不会导致任何错误。
下面的代码是测试用的,我这里尝试实现一个队列。
void push(struct node **head, Task * newTask) {
struct node* temp = malloc(sizeof(struct node));
temp->task = newTask;
temp->next = NULL;
struct node* curr = *head;
if (*head == NULL) {
puts("Entered here");
temp->next = *head;
*head = temp;
} else {
while (curr->next != NULL) {
curr = curr->next;
}
curr->next = temp;
}
}
Task* pop(struct node** head, Task** returnTask) {
struct node* returnNode = *head;
*returnTask = returnNode->task;
*head = returnNode->next;
free(returnNode);
printf("%s\n", (*returnTask)->name);
return *returnTask;
}
下面是导致分段错误的代码(returnedTask)
错误:分段错误(核心转储)
void schedule() {
struct node* queue = NULL;
Task* currTask = pickNextTask(); //Returns a Task
push(&queue, currTask);
Task* newTask = NULL;
Task* returnedTask = pop(&queue, &newTask);
printf("%s", newTask->name); //Runs fine
printf("%s", returnedTask->name); //Segmentation fault
}
Task.h 定义
#ifndef TASK_H
#define TASK_H
// representation of a task
typedef struct task {
char *name;
int tid;
int priority;
int burst;
} Task;
#endif
节点
struct node {
Task *task;
struct node *next;
};
【问题讨论】:
-
请提供完整的示例,以便我们查看结构定义等...另外,请提供确切的错误消息
-
@the_endian 它已更新!谢谢你告诉我
-
我看不出您的示例(不是minimal reproducible example BTW)为什么会出错。这个对我有用。请提供minimal reproducible example。
-
当您访问
name时我们无法首先看到name是如何获取其值的,我们如何解决错误?你需要给我们足够的代码来重现问题。
标签: c