我试着写一个简单的程序,接收用户的输入,然后打印出来在用户输入"done"
之前一直这样做。
当我运行下面的代码时,我输入“01”,然后得到一个Segmentation Fault ( core dumped )
。
我认为这与getline()
有关,但我不知道如果有人能向我解释为什么不起作用以及如何修复它,我将不胜感激。
#include <stdio.h>
#include <stdlib.h>
int main(){
char* line;
size_t size ;
size = 100;
char* done;
done = "done";
printf("0");
while ( strcmp(line, "done") != 0 ) {
printf("1");
getline(&line, &size, stdin);
printf("2");
printf("%s\n", line);
}
return 0;
}
最佳答案
这里有一个指针,它什么也不指向(实际上是垃圾):
char* line;
从getline()的手册页:
如果*lineptr为空,那么getline()将为存储行分配一个缓冲区,该缓冲区应由用户程序释放(在这种情况下,*n中的值将被忽略。)
或者,在调用getline()之前,*lineptr可以包含指向malloc(3)分配的缓冲区*n字节大小的指针如果缓冲区不够大,无法容纳行,getline()将使用realloc(3)调整其大小,并根据需要更新*lineptr和*n。
在这两种情况下,如果调用成功,*lineptr和*n将分别更新以反映缓冲区地址和分配的大小。
因此,请注意,不能为getline使用堆栈分配的缓冲区。
更简单的方法是将
line
初始化为NULL并让getline
为您处理分配:char* line = NULL;
int size = 0;
getline(&line, &size, stdin); // line and size are updated with buffer addr and size.
//...
free(line);
关于c - 使用getline()输入时出现段错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11198305/