调用getline函数时char* buffer触发segmentation fault原因问询
问题结论
是的,你遇到的segmentation fault正是由第10行的char* buffer未分配有效内存直接使用导致的。
原因解释
char* buffer = NULL仅定义了一个指向空地址的字符指针,没有申请任何可写入的内存空间。fin.getline()要求传入的第一个参数是已分配、可写入的内存起始地址,你传入空指针后,函数会尝试往空地址写入读取到的文件内容,触发非法内存访问,直接导致段错误。- 你注释中提到的替换为
char buffer[100]后运行正常,本质就是在栈上分配了100字节的可写内存,符合getline的参数要求。
代码其他问题修正建议
你的代码还存在两处常见的逻辑问题,可一并修复:
- 文件打开失败的判断分支没有退出逻辑
如果文件打开失败输出Opps!之后,代码仍会继续执行后续读文件逻辑,此时fin状态异常会引发额外错误,应该在输出错误后直接退出程序。 while(!fin.eof())的判断逻辑错误
eof标记是在读操作尝试读取到文件末尾之后才会被置位,并不是提前判断下一次读操作是否到末尾,会导致最后一行内容被重复读取一次,推荐直接将读操作作为循环判断条件。
修正后的代码示例
#include <iostream> #include <fstream> int main() { const char* filename = "directory of my file";// mnt/c/Users/... std::fstream fin(filename,std::fstream::in); if(!fin.is_open()) { std::cout << "Opps!" << std::endl; return 1; // 打开失败直接退出 } char buffer[100]; // 直接用读操作作为循环条件 while(fin.getline(buffer,100)) { std::cout << buffer << std::endl; } // 如果需要用动态分配的指针,也可以用以下写法: // char* buffer = new char[100]; // while(fin.getline(buffer,100)) // { // std::cout << buffer << std::endl; // } // delete[] buffer; // 动态分配的内存需要手动释放 return 0; }
内容的提问来源于stack exchange,提问作者meysamimani
相关产品推荐
相关产品推荐

