考虑这一段精简代码:
#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
之间的这种互动?
答案 0 :(得分:3)
问题在于buffer
和nbytes
都是酉化的。来自man getline()
:
或者,在调用getline()之前,* lineptr可以包含一个指向malloc(3)分配缓冲区* n字节大小的指针。如果缓冲区不足以容纳该行,则getline()使用realloc(3)调整其大小,根据需要更新* lineptr和* n。
getline()
将写入随机位置内存(无论值buffer
持有),它已被告知大小为nbytes
(某个未知值)。这是undefined behaviour。
要更正,请将变量初始化为有效值,并在使用前检查fopen()
的结果。