通过大型多维数组在C中运行

时间:2010-05-27 22:42:18

标签: c function multidimensional-array segmentation-fault argument-passing

我无法将大数组传递给C中的函数。

我宣布:

int image[height][width][3]={};

高度和宽度可以达到1500.当我打电话时:

foo((void *)image,height,width);

声明如下:

int *foo(const int *inputImage, int h, int w);

我得到分段错误错误。奇怪的是,如果我的价值观是:

height=1200;
width=290;

没有问题,但是当它们出现时:

height=1200;
width=291;

我得到了上面提到的错误。每个整数4个字节,高度和宽度都是1500(绝对最差的情况),数组大小将是27MB,imo不是那么大,并不应该真正重要,因为我只传递一个指向第一个元素的指针数组。有什么建议吗?

2 个答案:

答案 0 :(得分:3)

在27 MB时,您的阵列可能比堆栈大,通常为1 MB。 foo开始使用数据后,您就会破坏您的流程。而是在堆上分配数组:

typedef int (*image_buf)[height][width][3];
image_buf image = malloc(sizeof(image_buf));
...

答案 1 :(得分:0)

您可以在unix系统上使用'ulimit -a'检查默认进程堆栈大小

   (blocks, -c) 0

数据seg大小(kbytes,-d)无限制 调度优先级(-e)20 文件大小(块,-f)无限制 待处理信号(-i)16382 最大锁定内存(kbytes,-l)64 最大内存大小(千字节,-m)无限制 打开文件(-n)1024 管道大小(512字节,-p)8 POSIX消息队列(字节,-q)819200 实时优先级(-r)0 堆栈大小(千字节,-s)8192 cpu时间(秒,-t)无限制 最大用户进程(-u)无限制 虚拟内存(kbytes,-v)无限制 文件锁(-x)无限