1

我无法将大数组传递给 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 不是那么大,也不应该真正重要,因为我只传递了一个指向第一个元素的指针数组。有什么建议吗?

4

2 回答 2

3

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

typedef int (*image_buf)[height][width][3];
image_buf image = malloc(sizeof(image_buf));
...
于 2010-05-27T22:44:51.103 回答
0

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

   (blocks, -c) 0

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

于 2010-06-12T04:41:05.850 回答