【问题标题】:Why is assigning a file pointer to a structure pointer member causing a segmentation fault?为什么将文件指针分配给结构指针成员会导致分段错误?
【发布时间】:2020-08-13 05:09:33
【问题描述】:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct CCSV {
    FILE *file;
} CCSV;

CCSV *csv_open(char *filename) {    
    CCSV *csv;

    csv->file = fopen(filename, "r");

    if (csv->file == NULL)
        return NULL;

    return csv;
}

int main(void) {
    CCSV *csv = csv_open("cars.csv");

    if (csv == NULL) {
        puts("CSV File doesn't exist.");
    }

    return 0;
}

特别是使用csv_open 函数,我试图将csv-&gt;file 分配给fopen(filename, "r"),但这会导致分段错误。我一直在网上搜索并尝试解决此问题,但没有任何效果。

为什么将文件指针分配给结构指针成员会导致分段错误?

【问题讨论】:

  • 您正在取消引用指向未分配内存的指针。使用malloc:CCSV *csv = malloc(sizeof(*csv))。
  • 由于某种原因,当我返回 NULL(if (csv-&gt;file == NULL))时,即使使用动态内存分配,它也会返回分段错误。
  • 我看不出根据您在此处显示的代码会发生段错误,只要您如上所示或在 tadman 的答案中调用 malloc。您运行的代码是否与该更改完全相同?
  • gyazo.com/39c7db161de690167760a4ac89ca7d79我释放并关闭了文件,当我输入puts("CSV File doesn't exist.");时,出现分段错误。
  • 如果打开失败,不要尝试关闭死文件。我建议尽量减少你的代码。如果您检查csv-&gt;file 是否为空,您可以将您的问题归结为fclose(NULL),这应该可以让您清楚地了解问题是什么以及如何解决它。

标签: c pointers


【解决方案1】:

这一行创建了一个指针,但是这个指针是未初始化和未分配的:

CCSV *csv;

你应该分配:

CCSV *csv = malloc(sizeof(CCSV));

完成后你也应该free()这个。

在 C 中,您需要非常小心地释放您分配的任何内存。您定义此函数的方式会在错误时泄漏内存。要解决这个问题,请重新组织一下:

CCSV *csv_open(char *filename) {    
    FILE* file = fopen(filename, "r");

    if (file == NULL)
        return NULL;

    CCSV *csv = malloc(sizeof(CCSV));

    csv->file = file;

    return csv;
}

这样如果有错误你不会进入分配阶段,但如果你分配了你会返回它。

【讨论】:

  • 哦,你能给我一个为什么我必须malloc的理由吗?另外,您知道为什么出于某种原因if (file == NULL) 并且即使使用 malloc 语句也会导致分段错误?
  • 我不确定 CCSV 是什么,许多 C 库都有 make_csv() 之类的东西,它会为您分配结构,因此您可能需要仔细检查应该如何分配这些结构。如果您使用的是指针,则必须进行分配,这里没有其他选择,或者您只是在内存中的某个随机位置上踩踏,这可能会导致立即崩溃(分段错误)。
  • CCSV 是一个结构,它在代码中。 gyazo.com/39c7db161de690167760a4ac89ca7d79我释放并关闭了文件,当我输入puts("CSV File doesn't exist.");时,出现分段错误。
  • 如果您遇到分段错误,下一步是在调试器中运行它并找出原因。
  • ggorlen 解决了我的问题,我正在关闭死文件,导致分段错误。但是,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 1970-01-01
相关资源
最近更新 更多