Динамический Массив char Pointer - PullRequest
1 голос
/ 30 ноября 2011

Я пытаюсь определить динамический массив, содержащий указатели на символы, указывающие на строки.Строка может быть любой длины, поэтому я использовал указатели на символы.Я хочу динамически изменять размер массива каждый раз, когда мне нужно сохранить больше значений.Следующий код дает мне ошибку сегментации.У меня все хорошо?

int main() {
    char **input=NULL;
    char *buffer;

    int i=0;

    do {
        input = (char **)realloc(input, (i+1) * sizeof(char *));

        scanf("%s", &buffer);
        strcpy(input[i++],buffer);

    } while(strlen(buffer)!=0);


}

Ответы [ 5 ]

8 голосов
/ 30 ноября 2011

В вашем коде несколько проблем. Это не сработает, пока вы не исправите их все

  • Вы не выделяете память для buffer. Сканф писал бы в пустую, если бы не следующий пункт, который, возможно, более серьезен
  • Вы должны передать buffer в scanf, не &buffer
  • Вы не выделяете память для input[i]. Вы только выделяете память на input.
1 голос
/ 30 ноября 2011

В дополнение к проблемам, уже перечисленным в других ответах, цикл никогда не прекратится следующим образом:

scanf("%s", buffer);

не вернется, пока не прочитает хотя бы один символ, исключая символ конца строки.

1 голос
/ 30 ноября 2011

Проблема в том, что вы определяете buffer как указатель, но вы не указываете на то, что может содержать отсканированную строку, поэтому scanf записывает в нераспределенную память, что действительно плохо.Вы также не выделяете input[i], поэтому strcpy также потерпит неудачу.Возможно, вы захотите изменить это, чтобы использовать strdup вместо этого:

input[i++] = strdup(buffer);

Еще пара придирок: при сканировании строки вам не нужен & в строковом буфере, поэтому повторите это так:

scanf("%s", buffer);

И вы не должны разыгрывать результат realloc (или malloc либо в этом отношении):

input = realloc(input, (i+1) * sizeof(char *));
1 голос
/ 30 ноября 2011

буфер неинициализирован.Кроме того, & buffer является указателем на указатель, а не на массив символов, как вы, вероятно, намереваетесь.

0 голосов
/ 30 ноября 2011

Ваш буфер и ваш ввод [i] не выделены.

...