簡體   English   中英

分配給返回指針的分段錯誤

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM