写入作为结构成员的字符数组

时间:2010-02-18 01:59:51

标签: c arrays struct segmentation-fault fgets

这是我第一次在这里发帖提问 - 我搜索过类似的问题,但没有找到我发现的问题。

以下是我标题中的摘录:

#define LINE_LEN_MAX 256

typedef struct line_description {
    char buffer[LINE_LEN_MAX + 1];
    [...]
} line;

这是我主要功能的片段:

int main(int argc, char *argv[]) {

    line *lineRead;

    //input: valid FILE *, read from cmdline
    //char buffer[LINE_LEN_MAX + 1];

    while(fgets(lineRead->buffer, LINE_LEN_MAX + 1, input) != NULL) {

        [...]

        memset(lineRead->buffer, 0, LINE_LEN_MAX + 1);
    }
}

我一直受到段错误的影响。如果我注释掉'memset()'行,我可以在输入段错误之前从输入文件中准确读出3行。

但是,如果我用本地char []替换'lineRead-> buffer',我能够完美地读取我的输入文件。

我不了解这里的结构?我想我想要的是指向结构内部char []开头的指针,但显然这不是正在发生的事情。

编辑:抱歉,忘了指定:我这里没有使用动态内存。

3 个答案:

答案 0 :(得分:2)

你程序中的

lineRead是一个未初始化的指针,可能不是你想要的。

你应该通过写一下来为一行分配一些存储空间。相反,line lineRead将在堆栈上分配line结构。然后使用.而不是->来访问其成员。

答案 1 :(得分:1)

您声明lineRead是指向line的指针,但实际上并未将其设置为指向任何内容。然后,当您尝试访问未初始化指针指向的随机位置时,会出现分段错误。

如果在本地范围内只需要lineRead,则它不应该是指针,只需将其声明为

line lineRead;

如果lineRead需要活得更长,那么函数真的需要动态分配,请使用指针,但也要为它应该指向的结构保留内存:

line *lineRead = malloc(sizeof(line));
lineRead->buffer[0] = '\0'; // or any other initializations...

答案 2 :(得分:1)

也许你只是从你的片段中遗漏了一些内容,但是你没有显示正在分配的结构。

line *lineRead; // uninitialized pointer: access to any field crashes
lineRead = (line*) malloc( sizeof( line_description ) );

或者,如果你不需要它在堆上(特别是考虑到main中最外层范围内的堆栈对象具有整个程序的生命周期),

line lineRead; // don't need to use a pointer!