2017-02-01 3 views
0

я получаю эту ошибку после того, как массив уже хранится несколько строк из пользовательского ввода, который говорит мне, что это, вероятно, повреждена память из-за линии:«перераспределить(): недействительный следующий размер» после нескольких успешных запусков

poemArray = (char **)realloc(poemArray, count + 1); 

Любая идея, что я делаю неправильно? Конкретное решение было бы высоко оценено!

line = (char *)malloc(MaxLineLen); 

    fgets(line, MaxLineLen, stdin); 
    /*Get current line from user input*/ 
    if(count == 0) 
    { 
     poemArray = malloc(sizeof(char *)); 
     printf("1\n"); 
    } 
    if(line[0] == '.'){ 
     break; 
    } 
    line = (char *)realloc(line, strlen(line)); 

    printf("2\n"); 

    if(count != 0) 
    { 
     poemArray = (char **)realloc(poemArray, count + 1); 
    } 
    poemArray[count] = line; 

    ++count; 
+1

Возможно, вы, скорее всего, прочитали в конце строки 'line'; 'realloc (строка, strlen (строка))' отключает нулевой ограничитель, поэтому нет способа, которым более поздний код может знать, когда прекратить чтение –

+0

'line = (char *) realloc (строка, строка (строка));' бессмысленная линия. Возьмите длину строки, которая уже есть * и *, затем * выделите для нее пространство? Что, что? –

+0

А, я вижу, вы * уменьшаете * выделение для строки. В этом случае вы забыли «+ 1» для оканчивающегося нуля на всех строках C. –

ответ

2

Это

poemArray = (char **)realloc(poemArray, count + 1); 

должен быть actualy

poemArray = realloc(poemArray, (count + 1) * sizeof(char *)); 

Кроме того, этот

line = (char *)realloc(line, strlen(line)); 

, вероятно, следует

line = realloc(line, strlen(line) + 1); 

Также неясно, почему вы делаете первоначальный malloc для poemArrayперед тем потенциал break. Таким образом, вы можете получить poemArray как неинициализированный массив размера 1. В чем смысл его неинициализации?


Кроме того, обратите внимание, что realloc предназначен для правильной обработки нулевого указателя в качестве первого аргумента. В таких случаях realloc по существу эквивалентен malloc. Воспользовавшись этой особенностью realloc, вы можете исключить выделенную обработку для состояния count == 0, в результате получив гораздо более компактный и элегантный код.

P.S. Почему некоторые звонки в malloc включают явное приведение, а другие нет? В любом случае нет смысла обрезать результаты функций выделения памяти в C.

+0

'x = realloc (x, ...);' ошибка 99.99%! – 0andriy

+0

@ 0andriy: 'x = realloc (x, ...);' определенно плохой код, так же как и не проверка результата 'malloc' для null - это плохой код. Но сначала первое: в коде в настоящее время содержатся более вопиющие проблемы. – AnT

+1

Спасибо, ребята. Код далеко не закончен, поэтому мне все равно придется добавлять дескрипторы для нулевых указателей. Я все еще довольно новичок в C, поэтому мне очень жаль, если вам хочется плакать, читая его, ха-ха. ура –