我写一个程序,将读取使用函数getline成字符串从infile中的线条,字符串转换为包含字符串的第一米非空白字符的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)。

#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

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

任何想法如何,我可以解决这个段错误? 感谢

有帮助吗?

解决方案

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

其他提示

我不知道为什么回溯指向string input;但是当你复制rowmap。如果mapsize比列的尺寸变大,你很可能最终SEG-断层。这将是更常见的一个更大的mapsize。

您也可以很好地踩在栈上可能会造成“错误”的核心转储返回地址。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top