繁体   English   中英

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

[英]Segmentation fault (core dumped) when using fscanf to read into a pointer

我正在尝试使用 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM