我试着写一个简单的程序,接收用户的输入,然后打印出来在用户输入"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/

10-12 00:21
查看更多