-2

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

#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部分会删除段错误。x3但是什么会导致和之间的这种相互作用getline呢?

4

1 回答 1

3

问题是两者buffernbytes都被统一化了。来自man getline()

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

getline()将写入buffer已被告知nbytes大小为(某个未知值)的随机位置存储器(无论值如何)。这是未定义的行为

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

于 2013-07-01T21:46:19.227 回答