【问题标题】:Pass multidimensional array to functions in c causes stack overflow将多维数组传递给c中的函数会导致堆栈溢出
【发布时间】:2014-01-06 04:41:49
【问题描述】:

我有以下代码:

#include <stdio.h>
#include "funcs.h"
void func1(int (*codes)[1296][2]);
void func2(int arr0[]);
void func4(int (*codes)[1296][2],int arr3[]);
int func5(int isValid[]);
void func6(int (*codes)[1296][2],int arr3[],int var0);
void func7(int arr2[]);
void func8(int arr1[],int idx);
void func1()
{
....
}

其中codes 是一个大小为 1296 x 1296 x 2 的 3d 数组。当我尝试编译我的代码时,即使在void func1 之后,我也会得到未处理的异常和堆栈溢出。为什么会这样?如何将codes 发送到我的每个函数?

编辑:我不能使用:

  • 除 stdio.h 之外的任何库
  • 任何全局或静态变量

据我所知,这就是所有限制。

【问题讨论】:

  • 为什么需要这么大的 3D 阵列?问题是完全分配数组。一旦你分配了它,将它传递给函数不是问题,但分配它是。您使用的是哪个系统(哦,评论中提到了 Windows)?您可以增加系统上程序的堆栈大小吗?
  • 因为我在写mastermind (4^6=1296)。我正在使用 Windows 7 Professional 64 位。如何增加堆栈大小?
  • 我的第一反应是“重新考虑你的算法——你做错了”。目前还不清楚为什么你需要这么多物品。你在用那个数组做什么? (2) 的第三维是什么。说到这里,你在用二次元做什么?
  • 我尝试了另一种使用二维数组的方法,但我的系统超时了。
  • 4^6 = 4096。使用位(或半字节)而不是整数。

标签: c arrays exception pointers multidimensional-array


【解决方案1】:

int 类型的 1296 x 1296 x 2 元素数组需要超过 8 MiB 的堆栈,这超出了某些系统所允许的范围。在 Mac OS X (10.9.1) 上,默认堆栈大小为 8 MiB。

要么使用malloc() 或其同类之一来分配数组,要么静态分配数组而不是在堆栈上。

【讨论】:

  • 我不能在 windows 上使用 malloc 和 im 。
  • 如果您不能使用malloc(),那么您将不得不对数组进行静态分配。要么在任何函数之外定义数组(有或没有关键字static),或者在一个函数内部使用关键字static定义它。
  • 我也不能使用静态或全局变量。
  • 为了大声哭泣!把所有糟糕的老师强加的条件放在前面,这样我们就知道我们(你)必须处理什么废话。这就像拔鸡牙一样!
  • 感谢您更新问题;请注意,这些限制对于人们理解至关重要。除非您可以增加程序堆栈上的可用空间,或者减小数组的大小,否则您会被淹没。你在做什么需要这么大的数组,还是老师指定的大小?
【解决方案2】:

编译错误一定是因为您分配的堆栈超出了系统允许的范围。因此,如果您像您似乎需要的那样静态分配大数组(从您显示的代码来看),您可能会很快耗尽堆栈内存。

您显示的代码不是导致此错误的原因;它只是函数原型。因此,请检查代码中的静态内存分配。

还可以考虑使用堆->动态分配内存

【讨论】:

    猜你喜欢
    • 2011-02-26
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-19
    相关资源
    最近更新 更多