c -使用fscanf读取指针时出现分段错误(核心转储)



我试图使用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,"%dn",a);
                printf("%dn",*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,"%dn",a);

:

fscanf(input,"%dn",&a);

当你写:

int *a;

那么a是一个指针,但目前它不指向任何地方。

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

例如,在main()中:

int b;
a = &b;
fscanf(input,"%dn",a);

同样,你的循环是错误的。使用feof几乎总是错误的(更不用说作为循环条件了)。相反,您应该测试实际的读取操作。在你的例子中:

while ( 1 == fscanf(input,"%dn",a) )
{
     printf("%dn", a);
}

相关内容

  • 没有找到相关文章

最新更新