我很好奇为什么会分配一个返回的指针给一个新的指针变量导致分割错误?但是,将指针作为双指针传递给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("%sn", (*returnTask)->name);
return *returnTask;
}
下面是导致分段错误的代码(returnedTask)
Error: Segmentation fault (core dump)
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;
};
我假设这个问题有足够的内容来回答它。这可能是一个错误的假设,这可能不是事实,这反过来意味着这很可能不是实际的答案。尽管如此,我还是要说明一点。
指纹虽然分散,但几乎可以肯定是一个接一个地添加来追踪问题,消除了几乎所有的假设。
这种类型的内存损坏表明在64位平台上编译,并且使用了隐式函数声明。这将导致指针位被剪掉,因为它隐式地将指针转换为int并返回。如果是,打开编译器警告并修复隐式转换警告。