2013-05-31 5 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

먼저 그 값을 할당, 메모리 할당,

변경 루프 Conductor->next에 할당되어야한다. – 0xc0de

답변

6

당신은 ConductorConductor->next을 할당하기 전에 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; 
} 

그렇지 않으면 Conductor->next "오래된"이 새로운 Conductor를 가리하지 않기 때문에 당신이 할당하기 전에 할당을하는 것이 중요합니다. 바로 여기

5

next 포인터에 메모리를 할당하지 않았습니다.

당신은 할당하기 전에 를 할당해야합니다

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

코드를 복사하는 동안 실수를했습니다. 바로 확인해보세요. 이 할당이 맞습니까? – Arlind

+0

@Arlind 아니요, 잘못된 순서로 처리하고 있습니다. 업데이트 된 답변을 참조하십시오. –

+0

감사합니다. 나는 그것을 지금 고쳤다. – Arlind

1

은 : 당신이 루프의 다음 반복에서 입력 값을 저장하는 역 참조하려고 할 때 지휘자는 NULL 값이 할당됩니다 Conductor = Conductor->next;

, 그래서 당신은 세그먼트 오류를 ​​얻을.

다른 사람들은 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

메모리는

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; 

}