如何使用Visual Studio解决堆栈大小问题(使用大数组运行C代码)
我第一次使用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)问题仍然存在,因为我未能执行如何使用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环境下工作。我搜索并安装了两
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
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(链表),这将是内存经济,但同时也会增加时间