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

时间:2010-01-27 18:45:39

标签: c++ arrays string segmentation-fault getline

我正在编写一个程序,它将使用getline读取来自infile的行,将字符串转换为包含字符串的前m个非空白字符的c-strings,然后将c-string连接成一个char数组。 / p>

示例文件可能如下所示:

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

XXXXX
XXXXX
XXXXX
XXXXX
XXXXX

所以我最终会得到一个2x5x5字符的char数组。 现在的问题是我的代码在上面显示的较小的测试用例中运行良好,但是当我在更大的网格上尝试它时分段错误(即100x100x100)。

#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;
}

我用一个infile调用这个程序: ./program&lt; infile.in

我使用gdb运行它并进行了回溯。 它总是指向“字符串输入”行

我有什么想法可以解决这个段错误? 感谢

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:2)

我不确定为什么回溯指向string input;,但是当您将row复制到map时。如果mapsize大于行的大小,你很可能最终会出现seg-faulting。对于更大的地图大小,这将更常见。

你也可能会在栈上返回可能导致“错误”核心转储的地址。