2013-05-31 67 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; 

}