getline中memcpy的奇怪段错误

时间:2013-07-01 21:38:00

标签: c segmentation-fault getline memcpy

考虑这一段精简代码:

#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行上出现段错误。我已经向你展示了整个程序 - x3从未使用过,我不知道这个声明是如何重要的。

我怀疑这是一个内存分配问题,因为取消注释= malloc部分会删除段错误。但是什么可能导致x3getline之间的这种互动?

1 个答案:

答案 0 :(得分:3)

问题在于buffernbytes都是酉化的。来自man getline()

  

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

getline()将写入随机位置内存(无论值buffer持有),它已被告知大小为nbytes(某个未知值)。这是undefined behaviour

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