使用getline()输入时出现分段错误

Pat*_*edy 1 c segmentation-fault

我正在尝试编写一个接收用户输入的简单程序,然后将其打印出来.这是为了在用户输入之前继续这样做"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;
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 10

在这里你只有一个指向什么的指针(实际上是垃圾):

char* line;
Run Code Online (Sandbox Code Playgroud)

getline()的手册页:

如果*lineptr为NULL,则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);
Run Code Online (Sandbox Code Playgroud)


oua*_*uah 5

您没有为以下内容分配内存:

char* line;
Run Code Online (Sandbox Code Playgroud)

line是指向有效对象之前的无效指针.使用malloc分配内存,例如,line = malloc(size);