[英]Segmentation error on Assignment to returned pointer
我很好奇为什么将返回的指针分配给新的指针变量会导致分段错误? 但是,将指针作为双指针传递给 pop() function 不会导致任何错误。
下面的代码用于测试目的,我正在尝试在这里实现一个队列。
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;
};
我将假设这个问题有足够的内容来回答它。 这可能是一个错误的假设,而且情况可能并非如此,这反过来意味着这很可能不是实际的答案。 不过,我有一点要说明。 里面有一个kernel的真理。
printfs 按原样分散,几乎可以肯定地一一添加以追踪问题,消除了几乎所有假设。
这种 memory 损坏表明在 64 位平台上编译并使用隐式 function 声明。 这导致指针位被剪掉,因为它隐式地将指针转换为 int 并返回。 如果是这样,请打开编译器警告并修复隐式转换警告。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.