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