2014-09-10 2 views
0

학교 과제를 수행 중이며 드라이버가 헤더 파일과 함께 나에게 제공되었습니다. 내 일은 텍스트 파일에서 데이터를 읽은 다음 이름을 검색하고 이메일 주소를 반환하는 기능을 완료하는 것입니다. 그것은 포인터와 구조체를 사용하는 데있어 거대한 연습입니다.무료()를 사용할 때 코어 덤프 얻기

프로그램은 이름과 전자 메일 주소의 텍스트 파일을 읽고 malloc()을 사용하여 구조 배열을 동적으로 만듭니다. struct Card은 두 개의 char 포인터로 만들어졌고, 나는 그 크기에 대해 strlen(), malloc() 메모리를 사용하고 주어진 메모리 주소에 구조체를 할당하여 데이터의 길이를 찾는다.

이름과 이메일을 인쇄하고 메모리를 무료로 사용하려고하면 모두 끝날 때까지 제대로 작동하는 것 같습니다. 매번 Aborted (코어 덤프) 메시지가 나타납니다. 문제가 무엇인지 모릅니다. 나는 시도하고 문제가 어디 있는지 추적 할 바로 free() 전에 printf()을 배치했지만이 발생하거나 이름/이메일 출력물 동안이나 그냥 한 줄이 내 printf() 테스트 포인트 때문에 발생 후에 것으로 보인다

free()이 실행되지 않기 전에.

나는 드라이버 프로그램이 괜찮다고 생각하고 있으며 내 기능과 관련이있다. 누구도 찌르는 것을 신경 쓰지 않습니까? 당신은 단지 함수의 끝에서 size로 설정되어 있기 때문에

//Main 
    #include <stdio.h> 
    #include <stdlib.h> 
    #include "lab9utils.h" 

    int main(int argc, char * argv[]) { 

     // Variable declarations. 
     struct Card * cards; 
     int size; 
     int k; 
     char * email; 

     // Make sure we have 2 extra command-line paramgers. 
     if (argc < 3) { 
      printf("Usage: ./lab9.exe <data_filename> <name_to_lookup>"); 
      return 0; 
     } 

     // Get the cards and do the lookup. 
     cards = getCards(argv[1], &size); 
     email = lookup(cards, argv[2], size); 

     // Display the output message ("sorry!" or "name -> email"). 
     if (email == NULL) { 
      printf("Sorry, that name was not in the list of cards.\n"); 
     } else { 
      printf("%s -> %s\n", argv[2], email); 
     } 

     // Free the memory used by the structures. 
     k = 0; 
     printf("Test Point#1"); 
     for (k = 0; k < size; k++) { 
      free(cards[k].name); 
      free(cards[k].email); 
     } 
     printf("Test Point#2"); 
     free(cards); 

     return 0; 
    } 





    // Header 

    #ifndef LAB9UTILS_H 
    #define LAB9UTILS_H 

    struct Card { 
     char * name; 
     char * email; 
    }; 

    struct Card * getCards(char * filename, int * size); 
    char * lookup(struct Card * cards, char * name, int size); 

    #endif 


    // Functions 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <string.h> 
    #include "lab9utils.h" 

    struct Card * getCards(char * filename, int * size_return) { 

     int i,size; 
     char cTempName[51]={0}; 
     char cTempEmail[51]={0}; 

     size = 0; 

     // I/O Setup 
     FILE *fp; 
     fp = fopen(filename,"r"); 

     // error checking 
     if(fp == NULL) 
     { 
      perror("Error in opening file"); 
      return(NULL); 
     } 

    // Input Loop  

     while(!feof(fp)) 
     { 
      fscanf(fp,"%s%s",cTempName,cTempEmail); 

      size++; 
     } 

     size=size-1; 

     fclose(fp); 

     struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card)); 

     fp = fopen(filename ,"r"); 

     // error checking 
     if(fp == NULL) 
     { 
      perror("Error in opening file"); 
      return(NULL); 
     } 

     for(i=0;i<size;i++) 
      { 
       fscanf(fp,"%s%s",cTempName,cTempEmail); 
       card[i].name=(char *)malloc((strlen(cTempName)+1)); 
       card[i].email=(char *)malloc((strlen(cTempEmail)+1)); 
       strcpy(card[i].name,cTempName); 
       strcpy(card[i].email,cTempEmail); 

      } 

     fclose(fp); 
     // loop to confirm data was read 
     for(i=0;i<size;i++) 
       { 
        printf("[ %d ] Name:%s email:%s Total size:%d\n",i,card[i].name,card[i].email,size); 
       } 

     *size_return = size;   

     return card; 

    } 

    char * lookup(struct Card * cards, char * name, int size) { 

     int i; 

     for(i=0;i<size;i++) 
      { 
       if (strcmp(cards[i].name,name)==0) 
       { 
        return cards[i].email; 
       } 
      } 

      return NULL; 

    } 
+1

당신은 * 당신의 프로그래밍이 코어 링 이유를 바로 찾을 수 있도록 도와위한 디버거가 만들어 * 알아? 그리고 Btw는 할당 크기 조정을 위해 사용하기 전에'* size_return'의 출력 변수를 결코 설정하지 않으므로, 당신은 불확실한 양의 데이터를 malloc합니다. 예 : this :'malloc (* size_return * sizeof (struct card))'가 잘못되었습니다. – WhozCraig

+0

디버거가 없으므로 강사가 메모장에서 프로그래밍하고 cmd 줄에 gcc를 사용합니다. 디버거와 같은 멋진 추가 기능을 가진 IDE가 우리에게 도움이된다고 느끼지 않습니다. –

+1

** gdb **는 무엇이든 상관 없지만 멋진 애드온 디버거이며, gcc가 있으면 사용할 수 있어야합니다. 사용할 수없는 경우 강사에게 언젠가 생계를 꾸려야한다고 말하면 빨리 사용하는 방법을 알게됩니다. (당신은 문자 그대로 하나를 사용하여 직업 경력의 절반을 소비 할 것이고 농담은 아님). – WhozCraig

답변

1

*size_return의 값은 쓰레기입니다.

변경이 : 여기에

struct Card * card = (struct Card *)malloc(*size_return * sizeof(struct Card)); 

:

struct Card * card = (struct Card *)malloc(size * sizeof(struct Card)); 
+0

감사합니다. 나는 그것을 완전히 놓쳤다. 약 1 시간 전에 작은 변화를 만들었고 나는 그들 모두를 얻었다 고 생각했습니다. 지금 일해라. –

+0

@ChefFlambe : 환영합니다 :) –