如何克服与Visual Studio的堆栈大小问题(大数组运行C代码)

我正在使用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_fileeditbin /STACK:size ,所以我的Windows(和VS 2013)问题仍然存在。 其实我觉得我不知道如何去执行它们。 我尝试从“开发人员命令提示符VS 13”以及使用运行(Windows开始底部 – >search(运行) – >运行(支持))执行它们。 如果可能,我请求你提供更多的细节。

我search,发现这个网站,并认为在这里可以find解决scheme。

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

Solutions Collecting From Web of "如何克服与Visual Studio的堆栈大小问题(大数组运行C代码)"

看来这背后的原因是堆栈溢出。 这个问题可以通过增加堆栈大小来解决。
在Visual Studio中,你可以使用/STACK:reserve[,commit]来做到这一点。 阅读MSDN文章 。


更详细的解释 :

在Windows平台下,堆栈大小信息包含在可执行文件中。 它可以在Visual Studio C ++编译期间设置。
或者,Microsoft提供了一个可以直接更改可执行文件的程序editbin.exe 这里有更多的细节:

Windows(编译期间):

  1. 选择Project->Setting
  2. 选择Link页面。
  3. 选择Category to Output
  4. Stack allocations下的Reserve:字段中键入您的首选堆栈大小。 例如十进制为32768 ,十六进制为0x20000

Windows(修改可执行文件):

Microsoft Visual Studio中包含两个程序, dumpbin.exeeditbin.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);