2015-03-31 2 views
0

Я пытаюсь создать массив 2d динамически, затем откройте txt-файл и скопируйте каждый снисходительный мой 2d-массив. Затем сохраните этот массив до моего основного. Я продолжаю сталкиваться с ошибкой сегментации. Любые предложения по исправлению этого кода? Кстати я думаю, что проблема звезды после 2-й раз в то время как цикл происходит ...Ошибка сегментации после цикла while, который следует за malloc

#include<stdio.h> 

    char **randomArrayofStrings(){ 
     char **twoArray=null; 
     int rows=50; 
     int col=20; 
     i=0; 
     FILE *file=null; 
     int messageSize=50;//this is number is trivial 
     file = fopen("somefile.txt","r"); 
     twoArray= malloc(rows*sizeof(char*)); 
     for(i=0;i<col;i++) 
     { 
      twoArray[i]=malloc(rows*sizeof(char)); 
      strcpy(twoArray[i], "some random word"); 
     } 
     while(!feof(file)) 
     { 
      fgets(dArray[i],messageSize, file); 
      strtok(dArray[i], "\n"); 
      i++; 
     } 
     return twoArray; 
    } 


    int main(int argc, char **argv) 
    { 
     char **localArray=null; 
     localArray=randomArrayofStrings(); 
     for(i=0;i<20;i++)//20 is just a random number 
      printf("Strings: %s", localArray[i]); 
    } 
+0

'вернуть twoArray' ->' вернуть twoArray; '(отсутствует'; '). –

ответ

1

Вы не suppossed к free()twoArray внутри randomArrayofStrings(). Вы должны освободить их внутри main(), как только закончите с использованием выделенного memeory.

Это говорит о том, что вы используете sizeof(localArray) в main(). Вы должны использовать точное значение, которое вы использовали для расчета twoArray.

+0

Я не понимаю, как я могу освободить (twoArray), если однажды я скопирую его адрес в localArray, (из моего знания noob) у main нет пути доступа и свободного 2Array – bluestar99

+0

@ RT89 Итак, если приведенное выше верно, почему вы возвращаете 'twoArray'? Его нельзя использовать в 'main()', правильно? Ну, он __is__ полезен и действителен внутри 'main()' до тех пор, пока вы не будете 'free()' it. Динамическая область распределения памяти является глобальной и до тех пор, пока у вас есть указатель _valid_ для доступа к ней, это нормально. –

+0

@ RT89 Вы извлекаете память и возвращаете указатель 'twoArray', который собирается в' localArray'. поэтому вы можете использовать 'localArray' для доступа к памяти, так же, как вы бы использовали' twoArray'. –

2

Как я вижу, в функции randomArrayofStrings петли for идет через колонки «Я перевалы в вашем коде. Таким образом, вы выделяете массив указателей первым и рассматривать его как cols, а затем в цикле вы выделяете rows.

. и после того, как malloc проверить значение, которое было возвращено и не использовать указатель, если после выделения памяти NULL

Чтобы освободить выделенную память, использовать перевернутую последовательность -. бесплатно все rows в петле и чем свободные cols раз Eg :

 for(i=0;i<col;i++){ 
      free(twoArray[i]); 
     } 
     free(twoArray); 
     twoArray = NULL; 

EDIT:

А также, чтобы использовать malloc и free вам нужно #include <stdlib.h> и #include <string.h> для strcopy, int i=0; должен быть вместо i=0;, и правильное нулевое значение для указателей NULL.

А что такое dArray? Я не вижу декларации или определения? Dou вы имеете в виду twoArray?

EDIT2:

Ниже моя версия вашей программы:

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

char **randomArrayofStrings(){ 
    char **twoArray=NULL; 
    char * ptr = NULL; 
    int rows=50; // this will be also message size 
    int cols=20; 
    int i=0; 
    FILE *file=NULL; 
    file = fopen("somefile.txt","r"); 
    if(file == NULL) 
     return NULL; 
    twoArray = (char**) malloc(cols * sizeof(char*)); 
    if(twoArray == NULL) 
    { 
     return NULL; 
    } 
    for(i=0;i<cols;i++) 
    { 
     twoArray[i] = (char*)malloc(rows*sizeof(char)); 
     if(twoArray[i] == NULL) 
      return NULL; 
     strcpy(twoArray[i], "some random word"); 
    } 
    i = 0; // reset counter 
    while(!feof(file)) 
    { 
     fgets(twoArray[i], rows, file); 
     ptr = strchr(twoArray[i],'\n'); 
     if(ptr) 
      *ptr = '\0'; 
     else 
      twoArray[i][rows-1] = '\0'; 
     i++; 
     if(i >= cols) 
      break; 
    } 
    fclose(file); 
    return twoArray; 
} 

void freeMy2dArray(char **twoArray, int n) 
{ 
    int i; 
    for(i=0; i < n; i++){ 
     free(twoArray[i]); 
    } 
    free(twoArray); 
    twoArray = NULL; 
} 


int main(int argc, char **argv) 
{ 
    int i; 
    char **localArray=NULL; 
    localArray = randomArrayofStrings(); 
    if(localArray == NULL) 
     return 1; 
    for(i=0;i<20;i++)//20 is just a random number 
     printf("Strings: %s\n", localArray[i]); 
    freeMy2dArray(localArray, 20); 
} 
Смежные вопросы