我有一个结构,但我的变量是全局的,如下所示:
const int kol=1e6;
int par[kol];
int h[kol];
int aps[kol];
struct dsu
{
void add(int v)
{
par[v]=v;
aps[v]=v;
}// and more...
}
之后,我想要两个 dsu 树,但问题是它们使用相同的源(par[kol] 和 aps[kol] 对于它们来说是相同的),所以我需要将这些数组设为本地数组,如下所示:
struct dsu
{
int par[kol];
int h[kol];
int aps[kol];
void add(int v)
{
par[v]=v;
aps[v]=v;
}
}// and more...
但是当我运行代码时它给了我运行时错误:
错误
0xC00000FD
是STATUS_STACK_OVERFLOW
。您的应用程序正在崩溃,因为您在应用程序主线程的调用堆栈上放置了太多数据。
1e6
是 106 即 1000000。因此,每个数组的大小是 sizeof(int) * 1000000
字节,并且您有 3 个。即 11MB 内存(假设 int
的大小为 4 字节)。
当数组位于结构体内部,并且该结构体的实例在线程调用堆栈内的自动内存中声明(即,作为函数内部的局部变量)时,您将占用 11MB 的线程堆栈内存,但是大多数线程堆栈默认只能容纳 1-4MB,具体取决于平台和项目设置。
全局内存没有这样的限制。当它首次加载到内存中时,在任何线程开始运行之前,它会作为应用程序的一部分静态分配。您可以拥有 11MB 的全局内存。更糟糕的是,它只会使 exe 文件的大小膨胀。
如果您的结构中确实需要如此大的数组,则必须在运行时使用
new int[kol]
或更好的 std::vector<int>(kol)
在动态内存中分配每个数组。或者,保留数组不变,并使用 new dsu
或更好的 std::make_unique<dsu>()
动态分配结构本身。