阵列初始化期间的分段错误

时间:2014-10-29 13:12:55

标签: c++ arrays

在初始化巨大的数组时,我有时会看到分段错误。

例如:

#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];

期间可以看到分段

可能是什么问题?在初始化数组时是否存在上述问题。

3 个答案:

答案 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可以用作容器