函数中的 fgets 使用变量获取分段错误,但使用硬编码字符串则没有

fgets in function gets segmentation fault with a variable, but not with hard coded string

我正在尝试遍历 .desktop 文件并从中逐行获取一些值,并将其全部存储在结构中。我想对很多文件执行此操作,因此能够将文件路径存储为变量并将其发送到函数非常重要。

这是出现错误的函数:

App * ParseApp (char * path) {
    printf("Path: %s\n", path);

    FILE * file = fopen(path, "r");
    char line[256];

    App * app = malloc(sizeof(struct App));

    printf("Malloc worked. sizeof line: %li\n", sizeof(line));

    while (fgets(line, sizeof(line), file)) {
        printf("about to parse line\n");
        ParseLine(app, line);
    }

    return app;
}

以下代码确实有效,并输出预期值:

App * app = ParseApp("/usr/share/applications/Android Studio.desktop");
printf("Name: %s", app->name);

但是,当使用变量将文件路径作为参数传递时,出现段错误:

char filepath[128];
strcpy(filepath, settings.folder);
strcat(filepath, "/");
strcat(filepath, filename);
App * app = ParseApp(filepath);

我确信 fgets 是我遇到段错误的地方,因为它在函数开始时正确输出文件路径,它甚至通过了 malloc 函数:

Path: /usr/share/applications/Android Studio.desktop

Malloc worked. sizeof line: 256
Segmentation fault (core dumped)

所以似乎只有硬编码的字符串值才有效。我认为问题可能是字符串变量的大小问题,但看到它在两种情况下如何以相同的方式输出,这似乎不是问题。

我添加了一个检查文件是否为空:

App * ParseApp (char * path) {
    printf("Path: %s\n", path);

    FILE * file = fopen(path, "r");
    char line[256];

    if (file == NULL)
        printf("file is null\n");

    App * app = malloc(sizeof(struct App));

    printf("Malloc worked. sizeof line: %li\n", sizeof(line));

    while (fgets(line, sizeof(line), file)) {
        printf("about to parse line\n");
        ParseLine(app, line);
    }

    return app;
}

而且确实输出file is null,所以我猜问题出在fopen。

换行符弄乱了 fopen,添加 filepath[strcspn(filepath, "\n")]=0; 解决了它。感谢您的帮助,尤其是 user3121023。