我正在使用Visual Studio 13第一次编译c代码。 代码完全可以运行在64 * 64(在我的程序中有几个数组)的2d数组,但是如果我将数组大小增加到128 * 128,它不会运行(但编译正确)。 相反,它会提示“.exe已停止工作”。 我的机器有4GB内存和相同的程序运行128 * 128arrays,如果我从Linux运行的代码。
让我提供一些更多的细节:我已经在同一台机器上使用Intel C Compiler(非商业版本)的linux运行相同的代码。 但由于一些问题,我现在被限制在Windows环境下工作。 我search并安装了两个c编译器(1)Visual Studio 13和(2)Borland C.两者都能很好地工作在一个小arrays上。 但是,当我增加数组大小Visual Studio给消息“.exe已经停止工作”。 我使用“开发人员命令提示符VS 13”中的“cl”来编译程序。
我觉得问题是堆栈大小。
在链接的详细说明 (如下所示)中,我看到了linux环境中使用的命令“ulimit”来增加堆栈大小。 我记得几年前使用它。
我觉得我们已经接近解决scheme,但是由于我没有执行dumpbin /headers executable_file
或editbin /STACK:size
,所以我的Windows(和VS 2013)问题仍然存在。 其实我觉得我不知道如何去执行它们。 我尝试从“开发人员命令提示符VS 13”以及使用运行(Windows开始底部 – >search(运行) – >运行(支持))执行它们。 如果可能,我请求你提供更多的细节。
我search,发现这个网站,并认为在这里可以find解决scheme。
请帮忙。 我想从Windows运行使用Visual Studio 13。
看来这背后的原因是堆栈溢出。 这个问题可以通过增加堆栈大小来解决。
在Visual Studio中,你可以使用/STACK:reserve[,commit]
来做到这一点。 阅读MSDN文章 。
更详细的解释 :
在Windows平台下,堆栈大小信息包含在可执行文件中。 它可以在Visual Studio C ++编译期间设置。
或者,Microsoft提供了一个可以直接更改可执行文件的程序editbin.exe
。 这里有更多的细节:
Windows(编译期间):
Project->Setting
。 Link
页面。 Category to Output
。 Stack allocations
下的Reserve:
字段中键入您的首选堆栈大小。 例如十进制为32768
,十六进制为0x20000
。 Windows(修改可执行文件):
Microsoft Visual Studio中包含两个程序, dumpbin.exe
和editbin.exe
。 运行dumpbin /headers executable_file
,您可以在optional header values
看到size of stack reserve
信息的size of stack reserve
。 运行editbin /STACK:size
来更改默认的堆栈大小。
Visual Studio不起作用?
虽然我不认为VS是一个有效的开发工具,但我非常怀疑这会导致你的问题。
128 * 128是16384.如果你的堆栈空间太少(在Windows上,默认情况下是1MB,如果我没有弄错的话),你定义了一个足够大的struct
数组(大小为64字节,更确切地说),然后这很容易导致堆栈溢出,因为自动数组通常 (虽然不一定)分配在堆栈上。
这听起来像你试图在栈上声明大数组。 堆栈内存通常是有限的; 这听起来像是你溢出了。
你可以通过给你的数组静态持续时间解决这个问题
static BigStruct arr[128][128];
或者为它动态分配内存
BigStruct (*arr)[128] = malloc(sizeof(*arr) * 128); // use arr free(arr);