C++ 分段错误取决于字符串长度?

C++ 分段错误取决于字符串长度?,c++,arrays,string,segmentation-fault,getline,C++,Arrays,String,Segmentation Fault,Getline,我正在编写一个程序,该程序将使用getline从一个内嵌中读取行并将其转换为字符串,将字符串转换为包含字符串的前m个非空白字符的c字符串,然后将c字符串连接到单个字符数组中 示例文件可能如下所示: 5 //number of rows and columns in a grid 2 //number of grids XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX XXXXX 因此,我将得到一个2x5x5个字符的字符数组

我正在编写一个程序,该程序将使用getline从一个内嵌中读取行并将其转换为字符串,将字符串转换为包含字符串的前m个非空白字符的c字符串,然后将c字符串连接到单个字符数组中

示例文件可能如下所示:

5    //number of rows and columns in a grid
2    //number of grids
XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

XXXXX
XXXXX
XXXXX
XXXXX
XXXXX
因此,我将得到一个2x5x5个字符的字符数组。 现在的问题是,我的代码在较小的测试用例(如上图所示)上运行良好,但在较大的网格(如100x100x100)上尝试时出现分段错误

我把这个程序叫做内嵌: /程序 我使用gdb运行了它,并进行了回溯。 它总是指向行字符串输入

有没有办法解决这个问题?
谢谢

map是一个VLA,分配在堆栈上,所以我猜您的问题是堆栈溢出。gdb指出了输入的构造,因为这是在这个溢出堆栈上构造的第一件事。

映射是一个VLA,分配在堆栈上,所以我猜您的问题是堆栈溢出。gdb指向输入的构造,因为这是在这个溢出堆栈上构造的第一件事。

我不确定为什么回溯指向字符串输入;但当您将行复制到地图中时。如果mapsize大于行的大小,则很可能导致seg断层。对于更大的贴图大小,这将更常见


您还可能在堆栈上对返回地址进行重击,这可能导致错误的内核转储。

我不确定为什么回溯指向字符串输入;但当您将行复制到地图中时。如果mapsize大于行的大小,则很可能导致seg断层。对于更大的贴图大小,这将更常见


C++也可以很好地对堆栈上的返回地址进行跺脚,这可能导致错误的内核转储。

运行时数组大小不是标准的C++兼容。它是C99兼容的,这就是gcc允许它的原因。您应该为变量使用更好的名称,包括循环中使用的变量。当你有一个循环时,我是一个很好的名字,当你有三个嵌套的循环时,如果你给它们取一个合适的名字会更好:level,row,col。。。另外,我不太明白为什么要创建一个动态字符数组来转储字符串的内容,然后复制到映射。。。为什么不直接从字符串中复制?运行时数组大小不是标准C++兼容的。它是C99兼容的,这就是gcc允许它的原因。您应该为变量使用更好的名称,包括循环中使用的变量。当你有一个循环时,我是一个很好的名字,当你有三个嵌套的循环时,如果你给它们取一个合适的名字会更好:level,row,col。。。另外,我不太明白为什么要创建一个动态字符数组来转储字符串的内容,然后复制到映射。。。为什么不直接从字符串复制呢?是的,100*100*100是一个兆字节,大多数机器上的堆栈大小。使用malloc代替。是的,100*100*100是一个兆字节,大多数机器上的堆栈大小。改用malloc。
#include <iostream>
#include <string>
using namespace std;
int main(){
  int mapsize,levels;
  cin>>mapsize;
  cin>>levels;
  char map[mapsize*mapsize*levels];
  string input;
  for (int i=0;i<levels;i++){
    for (int j=0;j<mapsize;j++){
      getline(cin,input);
      char *row;
      row=new char[input.size()+1];
      strcpy(row, input.c_str());
      for (int k=0;k<mapsize;k++){
        map[i*mapsize*mapsize+j*mapsize+k]=row[k];
      }
      delete [] row;
    }
  }
return 0;
}