c-getline中memcpy上出现奇怪的segfault



考虑一下这段精简的代码:

#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。但是什么原因导致x3getline之间的这种相互作用?

问题是buffernbytes都是单元化的。来自man getline():

或者,在调用getline()之前,*lineptr可以包含一个指向malloc(3)分配的缓冲区*n字节大小的指针。如果缓冲区不够大,无法容纳该行,getline()将使用realloc(3)调整其大小,并根据需要更新*lineptr和*n。

getline()将向随机位置存储器(无论buffer保持什么值)写入,其被告知大小为nbytes(某个未知值)。这是未定义的行为。

要进行更正,请将变量初始化为有效值,并在使用前检查fopen()的结果。

最新更新