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

Jac*_*row 1 c pointers

#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;
}
Run Code Online (Sandbox Code Playgroud)

具体用csv_open的功能,我想指定csv->filefopen(filename, "r"),但它造成分段错误。我一直在网上搜索并试图解决这个问题,但没有任何效果。

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

tad*_*man 5

这一行创建了一个指针,但该指针未初始化且未分配:

CCSV *csv;
Run Code Online (Sandbox Code Playgroud)

你应该分配:

CCSV *csv = malloc(sizeof(CCSV));
Run Code Online (Sandbox Code Playgroud)

完成后你也应该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;
}
Run Code Online (Sandbox Code Playgroud)

这样,如果出现错误,您将不会进入分配阶段,但如果您确实分配了,则会返回它。