使用fopen()时的分段错误

时间:2018-04-05 03:25:25

标签: c fopen

我不确定为什么会这样,但我得到了一个"分段错误(核心转储)"从这个非常简单的代码。任何想法为什么?我必须使用一个字符串来告诉fopen()要打开哪个文件。

#include <stdio.h>
#include <string.h>

int main(void) {
    char *small = "small.ppm";
    FILE * fp;
    char word[5];
    fp = fopen(small, "r");
    fscanf(fp, "%s", word);
    printf("%s\n", word);

    return 0;
}

2 个答案:

答案 0 :(得分:2)

您的代码可以调用未定义的行为,替换为:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char *small = "small.ppm";
    FILE * fp = fopen(small, "r");
    if (fp == NULL) {
        perror("fopen()");
        return EXIT_FAILURE;
    }
    char word[5];
    if (fscanf(fp, "%4s", word) != 1) {
        fprintf(stderr, "Error parsing\n");
        return EXIT_FAILURE;
    }
    printf("%s\n", word);
}

答案 1 :(得分:1)

如果文件不存在,fp将为NULL,因此fscanf(fp, ...)会出现段错误。

检查所有文件操作是否成功非常重要。通常的模式就像......

FILE *fp = fopen(filename, "r");
if( fp == NULL ) {
    fprintf(stderr, "Couldn't open %s: %s\n", filename, strerror(errno));
    exit(1);
}