2013-05-31 3 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->nextConductor->next перед назначением на Conductor.

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;

Conductor присваивается значение NULL, поэтому при попытке разыменования его для хранения входного значения в следующей итерации цикла вы получите ошибку сегментации.

Как уже указывалось, вы должны сначала выделить память для Conductor->next, используя malloc.

Могу ли я, наконец, рекомендовать, чтобы вы посмотрели на отладчик, такой как 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; 

} 
Смежные вопросы