1

我正在尝试编写一个简单的程序来接收用户输入,然后将其打印出来。一直这样做,直到用户键入"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;
}
4

3 回答 3

10

在这里,您只有一个指向任何内容的指针(实际上是垃圾):

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);
于 2012-06-25T22:33:25.080 回答
5

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

char* line;

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

于 2012-06-25T22:32:00.667 回答
1
char* line = malloc(size * sizeof(char));

当不再需要时记得释放内存:

free(line);
于 2012-06-25T22:32:58.630 回答