在初始化巨大的数组时,我有时会看到分段错误。
例如:
#include<iostream>
#include<limits>
using namespace std;
int main()
{
string h;
cin >> h;
int size=h.size();
cout << size << endl;
int arr[size][size];
cout << arr[0][0]<<endl;
arr[0][0]=1;
cout << arr[0][0]<<endl;
return 0;
}
当用户输入是一个小字符串时,可以说"sample"
程序运行正常。
当用户输入是一个大字符串,其大小为ex。 >1500
。在数组初始化int arr[size][size];
可能是什么问题?在初始化数组时是否存在上述问题。
答案 0 :(得分:1)
我认为这些初始化会导致内存不足,导致堆栈溢出。我建议在堆上或使用std:vector分配它。见这里:Segmentation fault on large array sizes
答案 1 :(得分:0)
我认为数组的大小必须始终是C ++中的编译时常量,即你的&#39; size&#39;必须在编译时知道变量。
如果您想要动态存储,请使用std :: vector
答案 2 :(得分:0)
MSDN表示Windows上的默认堆栈大小为1 MB - 如果每个维度中有1500个元素,则数组将占用1500 * 1500 * 4 bytes = 9000000 bytes = 8.58 megabytes
,不确定Linux(this个状态它是8 MB) - 我想这取决于编译器和分配。所以:
1)如果你知道字符串长度有一个限制,那么在Windows上使用/STACK
链接器标志相应地增加堆栈大小,或者像在this上发布的那样在Linux上回答
2)在堆上分配数组 - 如果你不想搞乱内存分配,std :: vector或std::unique_ptr可以用作容器