getline() 函数中 char* 缓冲区的分段错误

segmentation fault with char* buffer in getline() function

我在下面的代码中得到了分段文件。 原因在第 10 行,我猜我在哪里使用 char* 缓冲区。 我想知道这是为什么。

是不是buffer中的内存还没有分配?

代码如下:

  1 #include <iostream>
  2 #include <fstream>
  3
  4 int main()
  5 {
  6     const char* filename = "directory of my file";// mnt/c/Users/...
  7     std::fstream fin(filename,std::fstream::in);
  8     if(!fin.is_open())
  9         std::cout << "Opps!" << std::endl;
 10     char* buffer = NULL;//if char buffer[100] then it will be good.
 11     while(!fin.eof())
 12     {
 13         fin.getline(buffer,100);
 14         std::cout << buffer << std::endl;
 15     }
 16     return 0;
 17 }

Is it because the memory in the buffer is not still allocated?

是的。事实上,您甚至 没有 缓冲区。指针 buffer 为 NULL,这意味着它指向一个您无权访问的内存位置。然后您继续告诉 getline() 它可以从该地址开始最多写入 100 个字节。

当您使用 char buffer[100] 时它起作用了,因为这是一个分配在堆栈上的数组,大到足以容纳您承诺 getline() 可以写入的 100 字节的上限。

如果您事先不知道一行的长度并且希望能够处理任意长度,请考虑改用 std::string。这是在 C++ 中逐行读取文件的典型方法:

std::string line;
while (std::getline(fin, line))
{
    std::cout << line << "\n";
}

另请阅读:Why is iostream::eof inside a loop condition considered wrong?