Ошибка сегментации (сбрасывание ядра) при использовании fscanf для чтения в указатель

Я пытаюсь использовать fscanf для чтения и печати каждого символа на экране, но при запуске программы я получаю ошибку сегментации (сбрасывание ядра). Вот мой код:

#include  main(int argc, char * argv[]) { int *a ; FILE *input; if (argc>=2) { input= fopen(argv[1],"r"); if (input!=NULL) { while (feof(input)==0) { fscanf(input,"%d\n",a); printf("%d\n",*a); } fclose(input); } else { printf("Error!\n"); } } } 

Я предоставляю файл как аргумент, например:

 ./myprog input.txt 

Файл input.txt содержит следующее:

 23 47 55 70 

Переменная a не инициализируется, чтобы указывать на действительный адрес памяти.

Поэтому, скорее всего, это указывает на неверный адрес памяти.

Вот один из способов исправить это:

 int *a = malloc(sizeof(int)); ... free(a); // when done using it 

Вот еще один способ исправить это:

 int b; int *a = &b; 

Но я предлагаю вам выполнить следующие шаги, чтобы сделать его более простым и чистым …


Измените это:

 int *a; 

К этому:

 int a; 

И это:

 fscanf(input,"%d\n",a); 

К этому:

 fscanf(input,"%d\n",&a); 

Когда вы пишете:

 int *a; 

то a является указателем , но в настоящее время он не указывает нигде.

Вы должны указывать на допустимое хранилище для int , прежде чем fscanf его в fscanf .

Например, внутри main() :

 int b; a = &b; fscanf(input,"%d\n",a); 

Кроме того, ваш цикл неверен. Это почти всегда ошибка использования feof (не говоря уже о качестве условия цикла). Вместо этого вы должны проверить фактическую операцию чтения. В твоем случае:

 while ( 1 == fscanf(input,"%d\n",a) ) { printf("%d\n", a); }