使用fscanf读取指针时的分段错误(核心转储)

时间:2014-05-17 09:40:35

标签: c segmentation-fault scanf argv coredump

我尝试使用fscanf来读取和打印屏幕上的每个字符,但是当我运行程序时,我遇到了分段错误(核心转储)。这是我的代码:

#include <stdio.h>

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

2 个答案:

答案 0 :(得分:3)

变量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);

答案 1 :(得分:2)

当你写:

int *a;

然后a是一个指针,但目前它并不指向任何地方。

在将int提供给fscanf之前,您必须指出main()的有效存储空间。

例如,在int b; a = &b; fscanf(input,"%d\n",a); 内:

feof

另外,你的循环错了。使用while ( 1 == fscanf(input,"%d\n",a) ) { printf("%d\n", a); } 几乎总是错误(更不用说,作为循环条件)。相反,您应该测试实际的读取操作。在你的情况下:

{{1}}