0

我尝试将此 C++ 代码作为 Windows 控制台应用程序运行,但是当它启动时,它会立即关闭,只给我一个标准的“该程序已停止工作”错误,这是 Windows 通常给我的。

该程序的主要功能是(后面省略了一些额外的代码):

int main() {
    cout << "FIRST LINE";
    int fract[501][501];
    int rfract[501][501];
    int nufract[501][501];
    int nurfract[501][501];
    int snufract[501][501];
    int snurfract[501][501];
    system("PAUSE");
    return 0;
}

有趣的是,如果我只有前 2 个数组,程序运行良好,但如果我有其他 4 个数组中的任何一个(甚至只是其中一个),程序在启动时就会崩溃。我正在使用一台具有 4 GB RAM 的计算机,但我没有收到任何有用的错误消息,尽管这似乎是问题所在。如果我将它们的大小全部更改为[101][101](从 ~1.2 MB 到 ~50kB),问题就解决了,但我没有空间来输入函数。有没有办法解决这个问题?

4

3 回答 3

3

堆栈的大小远小于堆的大小。任何分配newmalloc进入堆的东西,但如果你不小心,你可以很快填满堆栈。

给定网站,你可能会得到一个包含这么多大数组的 Stack Overflow。

为此,请尝试以下代码:

#include <iostream>

int main(int argc, char* argv[])
{
int sarr2d[5][10];
typedef int dimension[10];
dimension* arr2d = new dimension[5];

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        sarr2d[i][j] = i*j;
    }
}

for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        arr2d[i][j] = i*j;
    }
}

// print it out
for(int i = 0; i < 5; i++)
{
    for(int j = 0; j < 10; j++)
    {
        std::cout << arr2d[i][j] << " ";
    }
    std::cout << "\n";
}

delete [] arr2d;
return 0;
}

这是由问题C++ Multi-dimensional Arrays on the Heap启发的

于 2012-04-28T00:56:14.653 回答
1

堆栈大小通常限制在一个相当小的默认大小。如果您需要更大的堆栈,通常可以将其告知链接器(以系统特定的方式)。

在这种特殊情况下,您还可以选择在函数外部的静态内存空间中分配变量main。该空间通常比堆栈空间大得多。

int fract[501][501];
int rfract[501][501];
int nufract[501][501];
int nurfract[501][501];
int snufract[501][501];
int snurfract[501][501];

int main() {
    cout << "FIRST LINE";

    system("PAUSE");
    return 0;
}
于 2012-04-28T11:52:56.720 回答
0

如果您真的想要堆栈中的项目,则可以使用 /F 开关(如果您使用的是 Microsoft 编译器),或者您可以在链接程序时指定堆栈的大小。我可能会选择 /F 开关。但是,这可能会占用堆空间(同时限制堆栈和堆)。

这是 MSDN 上有关增加堆栈大小的链接:

http://social.msdn.microsoft.com/Forums/da-DK/Vsexpressvc/thread/2a5b32b6-683b-4729-92d3-45ed7a89ef3f

于 2012-04-28T03:21:34.083 回答