2013-05-16 3 views
0

У меня есть char ** stringList, в котором я хочу написать строки неизвестного размера и количества.malloc on char ** читать и писать Ошибка

в какой-то момент у меня есть следующий код:

static char** stringList; 
static int laenge=0; 
static int size=0; 

void getInput(){ 
    char input[FILENAME_MAX]; 
    int zeilen=10; 
    int counter=0; 
    stringList = (char**) malloc(zeilen*sizeof(char*)); 
    size = zeilen*sizeof(char*); 
     while(fgets(input, FILENAME_MAX , stdin) != NULL) 
     { 
     if (strlen(input) <= 100){ 
      stringList[counter] = (char*) malloc(strlen(input)); 
      size += strlen(input); 
      if (stringList[counter] == NULL){ 
       exit(EXIT_FAILURE); 
      } 
      strcpy(stringList[counter],input); 
      counter++; 
      laenge++; 
     } else { 
      fprintf(stderr,"String longer than 100 characters\n"); 
     } 
     if (counter==zeilen){ 
      zeilen +=10; 
      stringList = (char**) realloc(stringList,size+10*sizeof(char)); 
      if (stringList == NULL){ 
       exit(EXIT_FAILURE); 
      } 
     } 
     } 
} 

В случае необходимости я могу увеличить размер StringList, чтобы сделать его способным хранить больше строк.

Valgrind дает мне WriteError на линии 1 и 5, тоже на линии Ошибка чтения 2.

+1

У вас 'malloc'ed достаточно памяти для' stringList' себя? (Кроме того, 'malloc'ing в строке 1 и присвоение в строке 5 утечки памяти' malloc'.) –

+0

Дайте нам минимальный пример кода, пожалуйста, мы не знаем тип ввода ect ... – NeeL

ответ

0

Если вы хотите, чтобы выделить больше памяти для char **stringList, вы можете использовать realloc()

BTW

это

stringList[counter] = input; 

должен быть изменен на

strcpy(stringList[counter], input); 

В противном случае память распределения с

stringList[counter] = (char*) malloc(sizeof(input)); 

не будет иметь никакого смысла

+0

stringList is malloc ' d с sizeof (char) * 10. –

+0

каждый раз, когда он заполняется i realloc (stringList, sizeof (stringList) + 10 * sizeof (char)) ... поскольку первое измерение не хранит строку, а управляет только строками, в которых строки хранятся не так, сверху размер. –

+0

, поэтому, если вы достигли 10 элементов, когда вы его заполняете, и вы хотите больше памяти для него, вы можете использовать realloc(). он позволит выделить больше данных для stringList. см. ссылку на страницу realloc() в ответе. есть пример того, как использовать realloc() – MOHAMED

1

Во-первых, вы должны выделить ваш буфер строк и убедитесь, что counter не увеличивается более чем max_strings:

char** stringList = (char**)malloc(max_strings*sizeof(char*)); 

Строка (1) должна быть (STRLEN вместо SizeOf):

stringList[counter] = (char*) malloc(1+strlen(input)); 

линия (5) должно быть (вы должны скопировать строку в выделенной памяти):

strcpy(stringList[counter], input); 
0

Прежде всего, если вы хотите, чтобы массив хранить неопределенное число элементов (char* в этом случае), вы должны использовать связный список (есть много обучающих и кода образцов через сеть), а не просто char**, потому что бесполезно использование realloc плохая практика (внутренне realloc выделить новый buf а затем скопируйте все из старого буфера в новый).

Однако, если вы хотите сохранить ваши char** есть некоторые вещи, которые нужно изменить:

  • Во-первых, вы должны проверить возвращаемое значение malloc в первый раз, вы называете его

  • Вторая вещь , вы должны сделать это, чтобы добавить символ '\0' в конце вашего char* (для его последующего использования позднее):

    stringList[counter] = (char *)malloc(strlen(input) + 1); // I add "+ 1" 
    stringList[counter][strlen(input)] = '\0'; // 0 works also 
    
  • Третья вещь, вы должны удалить size переменную, потому что это бесполезно

  • Четвертая вещь, внутри if (counter==zeilen) блока, вторая строка должна быть:

    stringList = (char**) realloc(stringList,zeilen*sizeof(char*)); // I replaced char by char * and used zeilen instead of "size+10" 
    

    Маленькая подсказка, если вы не хотите иметь эту проблему, вы можете заменить char* на *stringList и char на *(stringList[counter]) в другом sizeof внутри malloc/realloc вашего кода.

Кроме того, laenge не используется в вашем примере, а глобальная переменная - плохая практика.