0

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

这是我的标题中的片段:

#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[] 开头的指针,但显然这不是正在发生的事情。

编辑:对不起,忘了说明:我这里没有使用动态内存。

4

3 回答 3

2

lineRead在您的程序中是一个未初始化的指针,这可能不是您想要的。

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

于 2010-02-18T02:05:34.763 回答
1

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

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

line lineRead;

如果lineRead函数需要更长的寿命,因此确实需要动态分配,请使用指针但也要为它应该指向的结构保留内存:

line *lineRead = malloc(sizeof(line));
lineRead->buffer[0] = '\0'; // or any other initializations...
于 2010-02-18T02:04:53.877 回答
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!
于 2010-02-18T02:05:16.907 回答