2016-11-02 47 views
0

我面臨的一個問題,我試圖調試它,但我找不到任何分段故障而從隊列彈出

#include <stdio.h> 
#include <stdlib.h> 

struct Process { 
    int id; 
    int at; 
    int bt; 
    int rt; 
    struct Process *next; 
} *tmp; 

struct Queue { 
    struct Process *head, *tail; 
}; 

struct Process *pop(struct Queue *queue) { 
    if (queue->head == NULL) { 
     return NULL; 
    } 
    tmp = queue->head; 
    queue->head = queue->head->next; 
    return tmp; 
} 

int main() { 
    struct Queue queues[3]; 
    struct Process *working; 
    for (int i = 0; i < 3; i++) { 
     queues[i].head = NULL; 
    } 
    FILE *processesFile = fopen("processes.txt", "r"); 
    while (!feof(processesFile)) { 
     fscanf(processesFile, "%d %d %d", &id, &at, &bt); 
     push(&queues[0], id, at, bt); 
    } 
    working = pop(&queues[0]); // HERE IS THE PROBLEM, It is removing the first element but causing segmentation error 
    return 0; 
} 

我刪除了推部分,我可以成功推5個值打印整個隊列沒有任何問題

+2

問題可能出在推送部分。例如,如果在推送時不將'next'字段設置爲NULL。你能[編輯]你的文章,以便我們可以看到它嗎? –

+0

我不知道這是否是解決方案,因此發表評論。您正在使用可怕的'feof'。它不會告訴你在文件結束。請看[爲什麼「while(!feof(file))」總是出錯?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)。如果你已經對'fscanf'的返回值做了必要的檢查,那麼這個錯誤就會被困住。 'if(fscanf(processesFile,「%d%d%d」,&id,&at,&bt)!= 3){/ * trap error * /};'。 (fscanf(processesFile,「%d%d%d」,&id,&at,&bt)== 3){/ * process * /}' –

+0

@ Jean-FrançoisFabre我忘記了將「next」設置爲NULL的情況。謝謝。 – Ambitions

回答

0

我看不到推的定義(&隊列[0],身份證,at,bt);. fscanf(processesFile,「%d%d%d」,& id,& at,& bt);這裏使用了變量id,at和bt,但它們實際上並未作爲結構變量訪問。