我正在编写一个程序,该程序将使用getline将infile中的行读取为字符串,将字符串转换为包含字符串的前m个非空白字符的c字符串,然后将c字符串连接为单个char数组.
一个示例文件可能看起来像这样:
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调用该程序:
./程序< infile.in
我已经使用gdb运行它并做了回溯.
它始终指向“字符串输入”行;
有什么想法可以解决此段错误吗?
谢谢
解决方法:
map是在堆栈上分配的VLA,因此我想您的问题是堆栈溢出. gdb指出了输入的构造,因为这是在此溢出堆栈上构造的第一件事.