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

时间:2012-06-25 22:31:25

标签: 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;
}

3 个答案:

答案 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);