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

时间:2013-12-23 13:33:53

标签: c windows visual-studio stack-overflow

我第一次使用Visual Studio 13编译c代码。代码完美地运行O.K.使用大小为64 * 64的2d数组(我的程序中有一些数组)但是如果我将数组大小增加到128 * 128则不会运行(但编译正确)。相反,它会给出一条消息“.exe已停止工作”。如果我从linux运行代码,我的机器有4GB内存和相同的程序运行128 * 128阵列。

让我提供一些更多细节:我在同一台机器上使用英特尔C编译器(非商业版)从linux运行相同的代码。但由于某些问题,我现在被限制在Windows环境中工作。我搜索并安装了两个c编译器(1)Visual Studio 13和(2)Borland C.两者都适用于小阵列。但是当我增加数组大小时,Visual Studio会给出消息“.exe已停止工作”。我使用“开发人员命令提示符VS 13”中的“cl”编译程序。

我觉得问题在于堆栈大小。

在链接detailed explanation中(如下所示)我在linux环境中看到了一个用于增加堆栈大小的命令“ulimit”。我记得几年前使用它。

我觉得我们接近解决方案,但由于我未能执行dumpbin /headers executable_fileeditbin /STACK:size,我的Windows(和VS 2013)问题仍然存在。其实我觉得我不知道如何执行它们。我尝试从“Developer Command Prompt VS 13”执行它们以及使用Run(windows start bottom-> search(run) - > Run(prop up))。如果可能,我请您提供更多详细信息。

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

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

4 个答案:

答案 0 :(得分:12)

这背后的原因似乎是堆栈溢出。可以通过增加堆栈大小来解决该问题 在visual studio中,您可以使用/STACK:reserve[,commit]来完成此操作。阅读MSDN article


更多detailed explanation

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

Windows(编译期间):

  1. 选择Project->Setting
  2. 选择Link页。
  3. 选择Category to Output
  4. Reserve:下的Stack allocations字段中输入您的首选堆栈大小。例如,十进制32768或十六进制0x20000
  5. Windows(修改可执行文件):

    Microsoft Visual Studio中包含两个程序,dumpbin.exeeditbin.exe。运行dumpbin /headers executable_file,您可以在size of stack reserve中看到optional header values信息。运行editbin /STACK:size以更改默认堆栈大小。

答案 1 :(得分:1)

  

Visual Studio不起作用?

虽然我不认为VS是一种有效的开发工具,但我非常怀疑它会导致你的问题。

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

答案 2 :(得分:0)

听起来你正在尝试在堆栈上声明大型数组。堆栈内存通常是有限的;听起来你已经满溢了。

您可以通过提供数组静态持续时间

来解决此问题
static BigStruct arr[128][128];

或为其动态分配内存

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

答案 3 :(得分:0)

完整的Visual Studio布局至少需要35 GB的磁盘空间。有关更多信息,请参阅系统要求。有关如何仅使用要安装的组件创建布局的信息,请参见使用命令行参数来安装Visual Studio。