2013-11-21 47 views
0

我在C語言中遇到問題。從函數中導出列表

這個for循環創建一個文件信息列表。 「pl」,「pc」和「pv」每行。

也打印每行的信息,3個數字。

============================================== =======

Ex。 1

for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){ 

    aux = (celula *)malloc(sizeof(celula)); 
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv)); 
    printf("%d %d %d\n", aux->pl , aux->pc, aux->pv); 

} 

========================================== ===========

在第二個示例中,我將信息打印出for循環,但在另一個循環中打印出了循環的前一個循環中創建的列表。

============================================== =======

Ex。 2

for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){ 

    aux = (celula *)malloc(sizeof(celula)); 
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv)); 
    /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/ 

} 

for(aux = base; aux != NULL; aux = aux->prox){ 

    printf("%d %d %d\n", aux->pl , aux->pc, aux->pv); 

} 

========================================== ===========

現在,問題是:在第一個例子中,它通常打印信息。在第二個示例中,不像第一個示例那樣正常打印信息,而是僅打印一條帶有「0 0 0」的行。

第1例和第2例之間有什麼不同?它不應該這樣做嗎?

請幫忙!

回答

0

儘管第一個示例似乎按照自己的意願進行了操作,但它們都存在缺陷。每次通過for循環時,您都不應該爲輔助內存分配內存。這將導致內存泄漏,並導致您丟失使用fscanf讀入的值。

您應該在for循環之外的malloc內存for aux。然後使用for循環使用fscanf將值讀入內存。

+0

試過這個... \t AUX =(celula *)malloc的(的sizeof(celula)); \t爲(I = 0,輔助=鹼基> PROX;我 PROX,我++){ \t \t \t \t的fscanf(文件, 「%d%d%d」,& (aux-> pl),&(aux-> pc),&(aux-> pv)); \t \t/* printf的( 「%d%d%d \ n」 個,AUX-> PL,AUX->電腦,AUX-> PV); */ } 段錯誤。 –

+0

這將有助於查看其他源代碼。 –

0
for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){ 

    aux = (celula *)malloc(sizeof(celula)); 
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv)); 
    /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/ 

} 

在你的循環,你正在做的aux = (celula *)malloc(sizeof(celula));這將覆蓋從aux = aux->prox採取aux。所以fscanned數據進入新分配的內存,而不是鏈接列表。

因此,當您再次引用另一個循環中的列表時,它沒有讀取數據。

如果鏈表已經創建,則不需要在for循環中分配aux。所以從循環中刪除malloc()

for(i = 0, aux = base->prox; i < p; aux = aux->prox, i++){ 
    //not needed 
    //aux = (celula *)malloc(sizeof(celula)); 
    fscanf(file, "%d %d %d", &(aux->pl) , &(aux->pc), &(aux->pv)); 
    /*printf("%d %d %d\n", aux->pl , aux->pc, aux->pv);*/ 

} 

如果未分配列表節點,請分配該列表節點並將其適當添加到列表中。

+0

嘗試這種... \t AUX =(celula *)malloc的(的sizeof(celula)); \t爲(I = 0,輔助=鹼基> PROX;我 PROX,我++){ \t \t \t \t的fscanf(文件, 「%d%d%d」,& (aux-> pl),&(aux-> pc),&(aux-> pv)); \t \t/* printf的( 「%d%d%d \ n」 個,AUX-> PL,AUX->電腦,AUX-> PV); */ } 段錯誤。 –

+0

@JoãoFilipe,這似乎是你如何建立鏈表的問題。 – Rohan