[英]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.