Простая программа, дающая segfault, не способная выяснить странное поведение - PullRequest
0 голосов
/ 06 мая 2011

Я передаю текстовый файл в качестве аргумента командной строки и отображаю его содержимое на стандартный вывод.Я хочу создать 5 целочисленных переменных (n, a, b, i, temp) в начале программы.Но программа выдает мне ошибку, когда я объявляю более 2 целых чисел.Если я закомментирую третье объявление int (int b), программа работает нормально.Также я работаю на Ubuntu.

main(int argc, char *argv[]){
    int n;
    int a;
    int b;
//  int i;
//  int temp;
    char *s;
    if(argc!=2){
            printf("not enough arguments provided!!\n");
            exit(-1);
    }
    FILE *fp = fopen(argv[1],"r");
    while((s=fgets(s,5,fp))!=NULL){
            n = atoi(s);
            printf("%d",n);
}
    fclose(fp);
}

Ответы [ 2 ]

3 голосов
/ 06 мая 2011

Ваш fgets(s,5,fp) считывает неинициализированный указатель.Вы должны выделить хранилище, в которое вы помещаете прочитанные данные.

Измените char *s; на char s[5];

Редактировать: Также измените условие цикла while:

while(fgets(s,5,fp)) {

Вы также должны проверить, успешно ли работает fopen ().

0 голосов
/ 06 мая 2011

s - неинициализированный указатель. При вызове fgets первым аргументом должно быть местоположение, в которое можно скопировать содержимое. s указывает не куда (или мусор), и попытка скопировать в это место является причиной ошибки.

Просто объявите:

char s[1] ; // Instead of char *s ; or declare it as an character array to 
            // to the size you may require.
...