如何使用Visual Studio解决堆栈大小问题(使用大数组运行C代码)

如何使用Visual Studio解决堆栈大小问题(使用大数组运行C代码),c,windows,visual-studio,stack-overflow,C,Windows,Visual Studio,Stack Overflow,我第一次使用VisualStudio13编译c代码。对于大小为64*64的2d Aray(我的程序中有几个数组),代码运行完全正常,但如果我将数组大小增加到128*128,它将无法运行(但编译正确)。相反,它会给出一条消息“.exe已停止工作”。我的机器有4GB的ram,如果我运行linux上的代码,同样的程序运行128*128阵列 让我提供更多细节:我在同一台机器上使用英特尔C编译器(非商业版)从linux运行了相同的代码。但由于一些问题,我现在只能在Windows环境下工作。我搜索并安装了两

我第一次使用VisualStudio13编译c代码。对于大小为64*64的2d Aray(我的程序中有几个数组),代码运行完全正常,但如果我将数组大小增加到128*128,它将无法运行(但编译正确)。相反,它会给出一条消息“.exe已停止工作”。我的机器有4GB的ram,如果我运行linux上的代码,同样的程序运行128*128阵列

让我提供更多细节:我在同一台机器上使用英特尔C编译器(非商业版)从linux运行了相同的代码。但由于一些问题,我现在只能在Windows环境下工作。我搜索并安装了两个c编译器(1)VisualStudio13和(2)Borland c。这两个编译器都可以很好地使用小数组。但当我增加数组大小时,Visual Studio发出消息“.exe已停止工作”。我使用“Developers Command Prompt VS 13”中的“cl”编译程序

我觉得问题在于堆栈大小

在链接中(如下所示),我看到在linux环境中使用命令“ulimit”来增加堆栈大小。我记得几年前用过它

我觉得我们已经接近解决方案了,但我的Windows(和VS 2013)问题仍然存在,因为我未能执行
dumpbin/headers可执行文件
editbin/STACK:size
。实际上我觉得我不知道如何执行它们。我试图从“开发者命令提示符VS 13”以及使用Run(windows开始底部->搜索(运行)->运行(支撑))来执行它们。我恳请您提供更多的细节,如果可能的话

我搜索并找到了这个网站,认为在这里可以找到解决方案


请帮忙。我想从Windows中使用Visual Studio 13运行。

听起来好像您试图在堆栈上声明大型数组。堆栈内存通常是有限的;听起来好像你把它溢出来了

您可以通过指定数组的静态持续时间来修复此问题

static BigStruct arr[128][128];
或者动态地为它分配内存

BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128);
// use arr
free(arr);

似乎这背后的原因是堆栈溢出。这个问题可以通过增加堆栈大小来解决。
在VisualStudio中,可以使用
/STACK:reserve[,commit]
执行此操作。读这本书


更多信息:

在Windows平台下,堆栈大小信息包含在可执行文件中。它可以在VisualStudioC++中编译时设置。 或者,Microsoft提供一个程序
editbin.exe
,可以更改 可直接执行文件。详情如下:

窗口(编译期间):

  • 选择
    Project->Setting
  • 选择
    链接
    页面
  • 选择要输出的类别
  • 堆栈下的
    保留:
    字段中键入首选堆栈大小 分配
    。例如,十进制的
    32768
    ,或十六进制的
    0x20000
  • Windows(修改可执行文件):

    Microsoft Visual Studio中包括两个程序,
    dumpbin.exe
    editbin.exe
    。运行
    dumpbin/headers可执行文件
    ,您可以在
    可选头值
    中查看堆栈保留的
    大小
    信息。运行
    editbin/STACK:size
    更改默认堆栈大小

    Visual Studio不工作

    虽然我不认为VS是一个有效的开发工具,但我高度怀疑它是否会导致您的问题


    128*128是16384。如果堆栈空间太小(在Windows上,如果我没弄错的话,默认情况下是1MB),那么就定义一个e。G如果
    struct
    s足够大(更精确地说,大小为64字节),那么这很容易导致堆栈溢出,因为自动数组通常(尽管不一定)分配在堆栈上。

    问题存在,但根据您的描述无法找到它。你需要给我们一些代码。如果不进一步阅读,我打赌VS是有效的!这并不是因为“VisualStudio不工作”<代码>128*128=16384。如果堆栈空间太小,并且定义了一个足够大的结构数组,这很容易导致堆栈溢出。如果我的问题直接或间接地伤害了任何情绪或规则,我很抱歉。没有意图破坏这个论坛的规则。我想询问的用户需要更详细的解释来解决他的问题。@nvoigt;对注意我的答案。几分钟后就会非常清晰。增加堆大小无法解决堆栈溢出问题。谢谢。我已经克服了dumpbin和editbin命令的问题。当然,我需要谷歌搜索的更多帮助,但最终你的建议脱颖而出。我现在可以用更大的数组大小运行代码了。我也借此机会感谢论坛。在/STACK中使用的单位是什么?字节?KB?我感到奇怪的是,官方文件中没有提到这一点。我不想使用“malloc”,尽管整个程序可以使用“malloc”进行调整。为什么?我们改天再说吧。但我有兴趣了解“staticbigstructarr[128][128];”。我将数组简单地声明为“double arr[128][128];”,因为我在计算中需要双精度。您是否建议我使用类似于“static BigStruct double arr[128][128];”的东西?这会有帮助的。请告诉我。
    BigStruct
    不是C关键字。你的问题没有说明你的数组是什么,所以它是你数组类型的占位符。如果您想要一个具有静态持续时间的双精度数组,请使用
    static double arr[128]128]我编写了普通的简单程序来模拟经典的流体流动问题,如流经圆柱等。数组用于存储不同的流动变量、速度等。正如我已经说过的,整个程序可以调整为使用malloc(链表),这将是内存经济,但同时也会增加时间