CIN 一个非常大的 int 数组,段故障 11
cin a very big int array, segment fault 11
这是我的代码:
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
错误。
这是怎么回事?
首先,
这C++无效。
std::cin>>n;
int lh[n][2];
n 应该是编译时常量。
其次,正如已经指出的,您对大 n 使用了太多内存
如果你真的想使用一个原始数组,你必须动态分配它,即在堆上:
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;
}
这很有趣,但它正是"堆栈溢出"。当您说"int x[n]"时,表示堆栈上分配的数组 x 的内存。默认堆栈大小取决于操作系统,但无论如何它是一些具体的数字(假设 8M)。当 n 足够大时,会发生堆栈溢出。若要避免此影响,请在堆上分配内存。即
int *x = new int[n];
这里有几种情况:10,000,000 可能超出了您平台中整数数据类型的范围。在代码中,i
和n
都是整数。同样,您可能无法在堆栈上分配那么多空间(同样取决于平台)。
相关文章:
- 数组的指针从不分段故障
- 将位字段导出到数组
- 结构字段名称与 GDB 中的 STL 数组冲突
- 结构数组中所有类似字段的总和
- 如何使用函数的输出初始化 const 数组结构字段?
- 如何使用连接器 c++ 在 mySQL 表二进制(16) 字段中存储 c++ 字节数组?
- 从数组调用字段
- 在类中定义数组的方法和字段
- 指向结构中的数组的指针,其中每个字段都是一个动态数组
- 数组中每个段的推力 CUDA 计算索引
- 为什么我在尝试将数组中的值写入 CSV 文件中时会出现段错误
- 在C++中使用 RapidJSON 访问 JSON 数组的字段
- c ++ 2d 数组和指向指针的指针 - 我不明白这段代码
- 无法从JNI设置Java Int数组字段
- 为什么这段代码给出错误......'a'是指针到字符指针,应该存储's'的地址,因为s是指向数组的第一个元素的指针
- 简单的C++字符数组加密功能 - 段故障
- 循环中的数组出现故障
- CIN 一个非常大的 int 数组,段故障 11
- c++ 插入数组算法故障
- C++、Integer和Char数组转换故障