2013-12-18 67 views
0

我有下面的代码:传递多维数组的C函数导致堆栈溢出

#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.当我尝试编译我的代码,我得到,即使在void func1之后,未处理的异常和堆栈溢出。为什么会发生?我如何将codes发送给我的每个功能?

编辑:我不能使用:

  • 任何库除stdio.h中
  • 任何全局或静态变量

那据我知道的所有限制。

+0

为什么你需要一个3D数组?问题是根本得不到数组。一旦你分配了它,把它传递给函数不是一个问题,但分配它就是了。你在哪个系统上(哦,Windows在评论中被提及)?你可以增加系统中程序的堆栈大小吗? –

+0

,因为我正在写主谋(4^6 = 1296)。我正在使用Windows 7专业64位。我如何增加堆栈大小? –

+0

我的直接反应是“重新思考你的算法 - 你做错了”。这很不明确你为什么需要这么多项目。你在做什么? (2)的第三个维度是什么?来吧,你在做第二个维度是什么? –

回答

1

类型为int的1296 x 1296 x 2元素的阵列需要超过8 MiB的堆栈,这比某些系统允许的要多。在Mac OS X(10.9.1)上,默认堆栈大小为8 MiB。

可以使用malloc()或其中之一来分配数组,或静态分配数组而不是在堆栈上。

+0

我不得不在Windows上确实使用malloc和im。 –

+0

如果你不能使用'malloc()',那么你将不得不对数组进行静态分配。可以在任何函数之外(使用或不使用关键字'static')定义数组,或使用关键字'static'在函数内定义它。 –

+0

我也不能使用静态或全局变量。 –

0

编译错误必须引起,因为您分配的堆栈多于系统允许的数量。因此,如果您静态分配像您需要的那样的大数组(从您显示的代码判断),您可能会很快耗尽堆栈内存。

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

还考虑使用堆 - >动态分配内存< - 摆脱这个错误。