【问题标题】:Segmentation fault during the initialization of array数组初始化期间的分段错误
【发布时间】:2014-12-25 05:08:24
【问题描述】:

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

例如:

#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。 &gt;1500.Segmentation 在数组的初始化过程中看到int arr[size][size];

可能是什么问题?像上面那样初始化数组有什么问题吗?

【问题讨论】:

    标签: c++ arrays


    【解决方案1】:

    我认为您的这些初始化内存不足,导致堆栈溢出。我建议在堆上或使用 std:vector 分配它。见这里:Segmentation fault on large array sizes

    【讨论】:

      【解决方案2】:

      我认为数组的大小必须始终是 C++ 中的编译时常量,即“大小”变量的值必须在编译时知道。

      如果你想要动态存储,使用 std::vector

      【讨论】:

        【解决方案3】:

        MSDN 声明 Windows 上的默认堆栈大小为 1 MB - 如果每个维度中有 1500 个元素,您的数组将占用 1500 * 1500 * 4 bytes = 9000000 bytes = 8.58 megabytes,不确定 Linux(this 声明它为 8 MB) - 我想这取决于编译器和分布。所以要么:

        1) 如果您知道字符串长度有限制,请使用 Windows 上的 /STACK 链接器标志相应地增加堆栈大小,或者在 Linux 上的this 答案中发布类似的内容

        2) 在堆上分配数组 - 如果您不想搞乱内存分配,std::vector 或 std::unique_ptr 可以用作容器

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-28
          • 1970-01-01
          • 2014-12-20
          • 2019-03-27
          • 2020-07-30
          • 2013-10-04
          • 2021-09-25
          • 2018-11-29
          相关资源
          最近更新 更多