2015-12-20 24 views
0

我使用「CodeBlocks編輯器」編譯爲「C」語言,編譯器爲「GNU GCC」。 我試圖讓從這種結構的鏈接:爲什麼在從文件加載過程中啓動指針發生變化?

struct node 
{ 
char *name; 
struct node *next; 
} node; 

其中包含一個字符串名稱和類型節點的指針(用於保存下一個項目的地址)

我寫了下面的代碼:

void load(FILE *p); 
    void add(node *add); 
     typedef struct node 
     { 
     char *name; 
     struct node *next; 
     } node; 

    node *start=NULL; 
    int main() 
    { 
    FILE *p; 
    *p=fopen("FILENAME","r+"); 
     if(p==NULL) 
     { 
     printf("Can not open the file"); 
     getch(); 
     return 0; 
     } 
    load(p); 
    return 0; 
    } 

    void add(node *add) 
    { 
    node *c=start; 
     if(start==NULL) 
     { 
     start=add; 
     start->next=NULL; 
     } 
     else 
     { 
     while((c->next)!=NULL) 
     { 
     c=c->next; 
     } 
     c->next=add; 
    add->next=NULL; 
    } 

    } 

    void load(FILE *p) 
    { 
    char line[30],*name; 

     while(!feof(p)) 
     { 
     fscanf(p,"%s",line); 
     node *e=(node *)malloc(sizeof(node)); 
     e->name=line; 
//comment line1:next line adds e to link list 
     add(e); 
    printf("%s,%s\n",e->name,start->name); 

     } 

    } 

,其中由FILE *p指出該文件是一個包含以下值的記事本的文本文件:

# 
Alex 
Ali 

通過運行代碼,我預計將查看這樣的事情:

#,# 
Alex,# 
Ali,# 

但實際上它是別的東西:

## 
AlexAlex 
AliAli 

這意味着start全球指針用的改變而改變指針E(的類型的節點)。我們知道的函數malloc每運行分配在堆一個新的空間。所以它是合理的連續值第在e需要在load功能的different.so不同的節點根據line1.But了不尋常的事情評論的下一行添加到鏈接列表指針start正在改變就像指針e一樣。 我已經允許開始改變只是當它是在開始 NULL,但它仍然繼續改變(看add函數的定義)。 發生了什麼?

+1

可能與您的問題無關,但'while(!feof(p))'是檢查C文件結尾的錯誤方法。 –

+0

此外,在程序執行期間,「start」使用你提供的數據。爲什麼不在Code :: Blocks中使用調試器並仔細觀察? – enhzflep

+2

您顯示的代碼不能編譯。有幾個錯誤,例如函數'add'已被寫入兩次。因此,你在這裏發佈的內容似乎並不是你正在運行的程序。這可能會讓我們難以幫助你發現你的錯誤,你不覺得嗎? –

回答

2

一般來說,如下行最有可能是錯誤的:

e->name=line; 

因爲line是函數的局部變量,所以一般功能時,超出範圍,其中將e->name點? (使用strcpy,而不是複製的linee->name內容 - 但在這之前,別忘了使用malloce->name分配內存或使用strdup)。

但特別是在你的情況下,問題似乎是:每個e->name指向相同內存位置:line。 (它似乎你被認爲=運算符中的字符串複製,沒有它不,它只是使e->nameline混淆)。解決方案與上段建議類似。

而且不要忘了,你已經分配free回憶。

+0

e指向Heap中的固定位置,當超出範圍時不會改變。線的值並不重要。主要的是,在加載函數運行時,我們應該將線串的值複製到e- >這也是一個字符串的名稱,那有什麼不對? – Agent47

+0

@ Agent47:那麼你如何複製line to e-> name的值? –

+0

通過以下代碼:e-> name = line; – Agent47

相關問題