2013-02-09 9 views
1

Я пытаюсь понять, почему я не могу сохранить файл в char **.Seg Fault char ** C

Я думал, что правильно выделил память. Может кто-нибудь, пожалуйста, помогите мне? Спасибо!

Кроме того, я знаю, что мой способ - не самый эффективный способ решить проблему, но сначала я хочу, чтобы проблема была решена, прежде чем я буду беспокоиться об эффективности. Спасибо!

void readFile(int argc, char** argv) 
{ 
    FILE *myFile; 
    char** list; 
    char c; 
    int wordLine = 0, counter = 0, i; 
    int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0; 

    myFile = fopen(argv[1], "r"); 

    if(!myFile) 
    { 
     printf("No such file or directory\n"); 
     exit(EXIT_FAILURE); 
    } 

    while((c = fgetc(myFile)) !=EOF) //goes through the file to get # of lines 
    {         //and columns so I can allocate array 
     numberOfChars++; 
     if(c == '\n') 
     { 
      if(maxNumberOfChars < numberOfChars) 
       maxNumberOfChars = numberOfChars + 1; 

      numberOfLines++; 
     } 
    } 

    fseek(myFile, 0, SEEK_SET); //resets file pointer 

    list = malloc(sizeof(char*)*numberOfLines); //dynamically allocating 

    for(i = 0; i < wordLine ; i++) 
     list[i] = malloc(sizeof(char)*maxNumberOfChars); 


    while((c = fgetc(myFile)) != EOF)  //stores in words 
    { 
     if(c == '\n' && counter > 0) 
     { 
      list[wordLine][counter] = '\0'; 
      wordLine++; 
      counter = 0; 
     } 
     else if(c != '\n') 
     { 
      list[wordLine][counter] = c; //seg fault happens at first character 
      counter++; 
     } 
    } 
    fclose(myFile); 
} 
+0

Пришло время научиться отлаживать ваши программы. И делайте обзоры кода, чтобы выявить очевидные ошибки. –

ответ

2

На данный момент:

for(i = 0; i < wordLine ; i++) 

wordLine = 0, так что память не будет выделена. Я думаю, что это должно быть:

for(i = 0; i < numberOfLines; i++) 

И вам нужно установить numberOfChars = 0, аналогично тому, что сказал Grijesh Чаухан, в противном случае вы будете выделять слишком много памяти.

+0

Спасибо. Извините, это 5 утра, и я был (в пятницу вечером: \) с 11 вечера, делая домашнее задание. Такая глупая ошибка. Спасибо, что поймали это. – juice

2

Ваше распределение для линий слова:

for(i = 0; i < wordLine ; i++) 
    list[i] = malloc(sizeof(char)*maxNumberOfChars); 

использует wordLine, но инициализируется в 0 в начале, и она никогда не изменяется.

Следовательно, malloc в этом цикле for никогда не выполняется.

1

Ваше for условие цикла перепутались,

for(i = 0; i < wordLine ; i++) 
    list[i] = malloc(sizeof(char)*maxNumberOfChars); 

wordLine инициализируется 0, он не выполняет, как ожидалось, и выделения памяти в list[i]

Вы можете изменить его на

for(i = 0; i < numberOfLines ; i++) 
    list[i] = malloc(sizeof(char)*maxNumberOfChars);