Ошибка сегментации с использованием массивов - PullRequest
0 голосов
/ 02 декабря 2010

Ну, я был на этом всегда, и я точно знаю, где ошибка, но не знаю, как ее исправить. Я уже знаю, что fgets и scanf были бы лучше для этой программы, но я не могу этого сделать.

Программа работала около 10 минут назад, затем я изменил ее и получил ошибку сегмента. Затем я изменил его обратно и все еще получил ошибку сегмента. Во всяком случае, я уверен, что свежие глаза увидят это сразу. Имей при этом: D

PS: Пожалуйста, обратите внимание на мой (lessthan) вместо <, потому что я не знаю, как правильно оставить те в моих примерах кода все еще: (</p>

#define WORDLENGTH 15
#define MAXLINE 1000

int main()
{
    char *line[MAXLINE];
    int i = 0;
    int j;
    int n;
    char c;


    for (n=0; c!=EOF; n++){
        char *tmp = (char *) malloc(sizeof(char)*WORDLENGTH);
        while ((c=getchar())!=' ')
            tmp[i++]=c;
        line[n]=tmp;
        i=0;
        printf("\n%s\n",line[n]); //
    }

    for(j = 0; j < n; j++){ 
        printf("\n%s\n", line[j]);  
        free (line[j]);            
    }

    return 0;
}

Ответы [ 2 ]

6 голосов
/ 02 декабря 2010

вы делаете line[n++] = tmp. И затем доступ к line[n] после этого. Но line[n] не было назначено.

Чтобы изменить его, вы можете напечатать line[n-1] вместо этого, но более понятным будет:

line[n] = tmp;
i = 0;
printf(... line[n]);

и вместо этого поместите приращение в оператор for, т.е. for (n = 0; c != EOF; n++).

EDIT

Это краткое изложение того, что я бы сделал:

Поместите назначение i=0 в начало цикла. Логически это инициализация i, и в настоящее время она выполняется в двух местах (в int i = 0; и после присвоения line[n]). Оба места не находятся рядом с тем местом, где можно ожидать инициализации переменной, используемой в цикле while.

Защитите от бессмысленного ввода, проверив, что i не превышает WORDLENGTH-1. На самом деле, я бы, вероятно, закодировал внутренний цикл while как цикл for, вот так:

for (i = 0; i < WORDLENGTH; i++) {
    tmp[i] = getchar();
    if (tmp[i] == ' ') break;
}
tmp[i] = 0;

или (в моем характере) for(i = 0; i < WORDLENGTH; ++i) if ((tmp[i] = getchar()) == ' ') break; с последующим ..

tmp[i] = 0 для NUL-конца строки. Поскольку malloc не обязательно возвращает заполненный 0 блок памяти.

1 голос
/ 02 декабря 2010

в предлагаемом решении все еще есть ошибки!

  1. malloc () может завершиться ошибкой и вернуть указатель NULL
  2. в конце for () максимальное значение i равно WORDLENGTH

, поэтому это назначение не является правильным (выходит за пределы)

    tmp[i]= 0;

Можно исправить как с

char *tmp = (char *) malloc( sizeof(char) * (WORDLENGTH + 1) );
if ( tmp == NULL )      // end of available memory
    break;

более того, неясно, разрешите ли вы EOF внутри последней строки.

...