这是我的代码:
int main(){
int n = 0;
std::cin>>n;
int lh[n][2];
for(int i = 0; i < n; i++) {
std::cin>>lh[i][0]>>lh[i][1];
}
return 0;
}
我不知道为什么,如果n非常小,它运行正常,但是当n更大时,比如10,000,000,结果是segmentfault 11
错误。
这里发生了什么?
答案 0 :(得分:5)
首先,这不是有效的C ++。
std::cin>>n;
int lh[n][2];
n应该是编译时常量。
其次如前所述,你正在为大n使用太多内存
答案 1 :(得分:1)
这很有趣,但确实是'堆栈溢出'。 当你说'int x [n]'时,在堆栈上分配的数组x的内存。默认的堆栈大小取决于操作系统,但无论如何它都是一些具体的数字(比方说8M)。当n足够大时,会发生堆栈溢出。要避免这种影响,请在堆上分配内存。即
int *x = new int[n];
答案 2 :(得分:1)
如果您真的想要使用原始数组,则必须动态分配它,即在堆上:
int main(){
int n = 0;
std::cin>>n;
int** lh = new int[n][2];
// Allocate memory
lh = new int*[n];
for (int i = 0; i < n; ++i)
lh[i] = new int[2];
// Assign values
lh[0][0] = 3;
lh[1][2] = 4;
// De-Allocate memory to prevent memory leak
for (int i = 0; i < n; ++i)
delete [] lh[i];
delete [] lh;
return 0;
}
但是,由于您可能尚未准备好使用多维原始堆数组,因此我强烈建议您使用std::vector
和更小的数组大小:
int main(){
int n = 0;
std::cin>>n;
std::vector<std::vector<int> > myVec;
for(int i = 0; i < n; i++)
{
std::vector<int> tempV;
int input = 0;
cin >> input;
tempV.push_back(input);
cin >> input;
tempV.push_back(input);
myVec.push_back(std::move(tempV));
}
return 0;
}
答案 3 :(得分:0)
这里的几个案例:10,000,000可能超出平台中整数数据类型的范围。在您的代码中,i
和n
都是整数。
您可能无法在堆栈上分配那么多空间(再次取决于平台)。