这是我第一次在这里发帖提问 - 我搜索过类似的问题,但没有找到我发现的问题。
以下是我标题中的摘录:
#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 []开头的指针,但显然这不是正在发生的事情。
编辑:抱歉,忘了指定:我这里没有使用动态内存。
答案 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!