我正在尝试编写一个接收用户输入的简单程序,然后将其打印出来。在用户键入"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;
}
答案 0 :(得分:9)
这里你只有一个指向什么的指针(实际上是垃圾):
char* line;
来自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);
答案 1 :(得分:5)
您没有为以下内容分配内存:
char* line;
line
在指向有效对象之前是无效指针。使用malloc
分配内存,例如line = malloc(size);
答案 2 :(得分:1)
char* line = malloc(size * sizeof(char));
当没有必要时记得释放记忆:
free(line);