You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用getline函数时char* buffer触发segmentation fault原因问询

问题结论

是的,你遇到的segmentation fault正是由第10行的char* buffer未分配有效内存直接使用导致的。

原因解释
  • char* buffer = NULL仅定义了一个指向空地址的字符指针,没有申请任何可写入的内存空间。fin.getline()要求传入的第一个参数是已分配、可写入的内存起始地址,你传入空指针后,函数会尝试往空地址写入读取到的文件内容,触发非法内存访问,直接导致段错误。
  • 你注释中提到的替换为char buffer[100]后运行正常,本质就是在栈上分配了100字节的可写内存,符合getline的参数要求。
代码其他问题修正建议

你的代码还存在两处常见的逻辑问题,可一并修复:

  1. 文件打开失败的判断分支没有退出逻辑
    如果文件打开失败输出Opps!之后,代码仍会继续执行后续读文件逻辑,此时fin状态异常会引发额外错误,应该在输出错误后直接退出程序。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:24:01