考虑一下这段精简的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
FILE * infile;
char * buffer; // = malloc(sizeof(char));
ssize_t line_length;
size_t nbytes;
int x1;
int x2;
//int x3;
infile = fopen("file.txt", "r");
getline(&buffer, &nbytes, infile);
}
如图所示,代码运行时没有任何错误。
如果我取消对int x3
的注释,则在getline
行上会得到一个segfault。我已经在这里向您展示了整个程序——x3
从未使用过,我不知道这个声明有多重要。
我怀疑这是内存分配问题,因为取消对= malloc
部分的注释会删除segfault。但是什么原因导致x3
和getline
之间的这种相互作用?
问题是buffer
和nbytes
都是单元化的。来自man getline()
:
或者,在调用getline()之前,*lineptr可以包含一个指向malloc(3)分配的缓冲区*n字节大小的指针。如果缓冲区不够大,无法容纳该行,getline()将使用realloc(3)调整其大小,并根据需要更新*lineptr和*n。
getline()
将向随机位置存储器(无论buffer
保持什么值)写入,其被告知大小为nbytes
(某个未知值)。这是未定义的行为。
要进行更正,请将变量初始化为有效值,并在使用前检查fopen()
的结果。