2014-03-28 3 views
0

이 코드의 문제점을 모르겠습니다. "ADD"에서 입력 한 항목을 "표시"할 때 많은 불필요한 항목이 표시됩니다. 왜 이런 일이 일어나는 걸까요?C 프로그래밍의 연결된 목록

temp= (struct list*)malloc(sizeof(struct list)); 

을하지만 당신은 당신의 구조의 값을 초기화하지 :

#include <stdio.h> 
#include <conio.h> 
#include <string.h> 
#include <ctype.h> 
#include <stdlib.h> 
struct list 
{ 
    char name[20]; 
    int age; 
    char gender[10]; 
    struct list *next; 
}; 

void main(void) 
{ 
    struct list *HEAD = NULL; 
    struct list *temp, *trav; 

    char choice; 


    while(1) 
    { 
     clrscr(); 
     printf("MENU\n"); 
     printf("A) ADD\n"); 
     printf("B) DISPLAY\n"); 
     printf("X) EXIT\n"); 

     scanf("%c", &choice); 
     switch(toupper(choice)) 
     { 
      case 'A': 
       temp= (struct list*)malloc(sizeof(struct list)); 
       printf("Fill-Up the following:\n"); 
       printf("Name:"); 
       fflush(stdin); 
       gets(temp->name); 
       printf("Age:"); 
       fflush(stdin); 
       scanf("%d",&temp->age); 
       printf("Gender:"); 
       fflush(stdin); 
       gets(temp->gender); 


       if(HEAD == NULL) 
       { 
        HEAD = temp; 

       } 
       else if(HEAD!=NULL) 
       { 
        for(trav=HEAD; trav->next != NULL; trav= trav->next); 
        trav->next=temp; 
       } 
       else 
       { 
        printf("Not Enough Memory!\n"); 
       } 


       break; 
      case 'B': 

       if(HEAD==NULL) 
       { 
        printf("Linked List is Empty!\n"); 
        getch(); 
        break; 
       } 
       if(HEAD!=NULL){ 
        for(trav=HEAD; trav != NULL; trav=trav->next) 
        { 

         printf("Name: %s\n", trav->name); 
         printf("Age: %d\n", trav->age); 
         printf("Gender: %s\n", trav->gender); 
         getch(); 
        } 
       } 

       break; 
      case 'X': 
       free(HEAD); 
       free(trav); 
       free(temp); 
       exit(1); 

       break; 
     } 
    } 
} 
+1

malloc temp에서는 다음을 제외한 모든 요소를 ​​설정합니다. 다음 요소는 반드시 NULL로 설정되어야한다. –

+1

포인터에 대한 불확정 값을 무시한 결정은 현명하지 않습니다. 예 :이 작업을 시작하고 X를 입력하면'trav'와'temp'를 해제 할 때 즉시 * 정의되지 않은 동작 *을 호출합니다. 유효한 내용도 제공되지 않습니다. 그리고 이것은 또한 표준 라이브러리에서 제거 된 함수 인'gets()'를 사용한다는 측면에서 중요하지 않습니다. 비표준'fflush (stdin) '이라는 단일 함수 결과를 검사하지 못하면리스트는 끝내기 전에 꽤 커질 수 있습니다. – WhozCraig

+0

@JerryJeremiah 아! 감사! 그것은 작동합니다 : 더 이상 쓰레기 D를 "표시" – JayrCastro

답변

2

는이 같은 온도를 초기화된다. 그래서 그들은 쓰레기를 포함합니다. 모든 malloc()은 힙에서 메모리 덩어리를 반환합니다. 당신은 care와 feeding에 대한 책임이 있으므로 모든 데이터 멤버를 NULL과 같은 알려진 값으로 설정하십시오. 이것은 디버거를 사용하고 mallloc() 할당 후 temp 값을 검사 할 때 매우 분명합니다 (영상). memory dump

따라서, 귀하의 malloc 구조의 데이터 멤버를 항상 초기화하는 것이 좋습니다.

+0

그는 키보드 입력으로 이름, 나이 및 geder를 초기화합니다. 중요한 다음 회원입니다. –

+0

죄송합니다, 정확합니다. – OldProgrammer