Linux下使用getline后出现Segmentation Fault问题求助
解决你的Segmentation Fault问题
首先,你的代码里的核心问题是未初始化的buffer指针导致的。我们来一步步拆解:
问题根源
char *buffer;这行代码只声明了一个指针,但没有给它赋值——它现在是一个野指针,指向内存里的随机地址。而getline函数的第一个参数有明确要求:如果传入的指针是NULL,它会自动为你分配足够的内存来存储输入;但如果是一个无效的野指针,getline会尝试去访问这个随机地址,直接触发段错误。
修复后的代码
只需要给buffer初始化为NULL,同时记得在程序结束前释放getline分配的内存(避免内存泄漏):
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> int main (void) { bool condition = true; char *buffer = NULL; // 关键:初始化指针为NULL char *pseudo; size_t characters; size_t bufsize = 32; characters = getline(&buffer, &bufsize, stdin); // 可以加个判断,检查getline是否成功读取输入 if (characters == -1) { fprintf(stderr, "读取输入失败\n"); free(buffer); // 即使读取失败,也要释放可能分配的内存 return 1; } pseudo = buffer; // 现在pseudo指向有效的内存地址 while (condition == true) { // 这里可以安全地使用pseudo了,比如打印测试: printf("你的昵称是:%s", pseudo); condition = false; // 记得加终止条件,不然会无限循环 } free(buffer); // 释放getline分配的内存 return 0; }
额外注意事项
getline返回的是读取到的字符数(包括换行符),如果返回-1表示读取失败(比如遇到EOF),这种情况要处理,避免后续操作无效指针。- 你原来的
while循环没有终止条件,会无限运行,记得加上condition = false或者其他符合你游戏逻辑的终止逻辑。 pseudo只是指向buffer的指针,不需要单独释放,释放buffer就够了。
内容的提问来源于stack exchange,提问作者Chetrit
相关产品推荐
相关产品推荐

