2013-05-31 145 views
0

我只是亂搞鏈表,但似乎我有很多錯誤的東西在我的腦海裏。我已經試過這個功能,我無法得到它的工作。我認爲我可以通過簡化它,但它仍然不起作用。它通常只打印第一個元素,然後是隨機大數(內存地址最有可能)鏈接列表錯誤 - C

我只是想創建一個列表並打印其內容。

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

struct el{ 
    int value; 
    struct el *next; 
}; 

typedef struct el Elem; 



int main() 
{ 
    int nr, i; 
    struct el *Head, *Conductor; 
    Head = malloc(sizeof(Elem)); 
    Conductor = Head; 
    printf("How many elements do you want to add? "); 
    scanf("%d", &nr); 
    for(i = 0; i < nr; i++) 
    { 
     printf("Enter value for element %d: ", i); 
     scanf("%d", &(Conductor->value)); 
     Conductor = Conductor->next; 
     Conductor = malloc(sizeof(Elem)); 


    } 
    free(Conductor->next); 
    Conductor->next = NULL; 

    Conductor = Head; 
    printf("\n"); 

    for(i = 0; i < nr; i++) 
    { 
     printf("%d -> ", Conductor->value); 
     Conductor = Conductor->next; 
    } 

    return 0; 
} 
+0

首先分配內存,然後分配該值。 – 0xc0de

回答

6

你應該分配給Conductor->next以前ConductorConductor->next分配內存。

for(i = 0; i < nr; i++) 
{ 
    printf("Enter value for element %d: ", i); 
    scanf("%d", &(Conductor->value)); 
    Conductor->next = malloc(sizeof(Elem)); 
    Conductor = Conductor->next; 
} 

重要的是,你做的分配之前的分配,否則「舊」 Conductor->next不會指向新Conductor

5

您不會爲next指針分配內存。

您需要分配分配

scanf("%d", &(Conductor->value)); 
Conductor->next = malloc(sizeof(Elem)); 
Conductor = Conductor->next; 
+0

我在複製代碼時犯了一個錯誤。現在檢查。這個分配是否正確? – Arlind

+0

@Arlind不,你按照錯誤的順序,請看我更新的答案。 –

+0

謝謝。我現在修好了 – Arlind

1

就在這裏: Conductor = Conductor->next;

導線被分配一個NULL值,所以當你嘗試取消引用它的輸入值存儲在循環的下一次迭代中你會得到一個分段錯誤。

正如其他人已經指出,你應該首先使用mallocConductor->next分配內存。

我最終能否推薦您查看調試器,如gdb,因爲它可以輕鬆識別此類問題?

這是我發現有使用是一個問題Conductor->next GDB:

我通過程序踩,直到我達到違例指令:

25 Conductor = Conductor->next; 

我試圖打印什麼在next

(gdb) print Conductor->next  

這裏就是我的了:

Cannot access memory at address 0x4 

而這正是我在Conductor

(gdb) print Conductor 
$7 = (struct el *) 0x804b008 

很容易看到我們有一個問題,因爲在接下來的循環將被分配一個無效值;

2

存儲器應分配給Conductor->next

改變環路如下,

for(i = 0; i < nr; i++) 
{ 
    printf("Enter value for element %d: ", i); 
    scanf("%d", &(Conductor->value)); 
    Conductor->next = malloc(sizeof(Elem)); 
    Conductor = Conductor->next; 

}