使用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是一个指针 ,但目前它没有指向任何地方。

在将其提供给fscanf之前,必须指向int有效存储。

例如,在main()

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

此外,你的循环是错误的。 使用feof几乎总是错误(更不用说,作为循环条件)。 相反,您应该测试实际的读取操作。 在你的情况下:

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