【问题标题】:Passing big multi-dimensional array to function in C将大的多维数组传递给C中的函数
【发布时间】:2011-02-24 21:57:21
【问题描述】:

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

【问题讨论】:

  • image 在堆栈上吗?如果是这样,您几乎可以肯定堆栈上的空间不足。尝试动态分配数组。

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


【解决方案1】:

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

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

【讨论】:

  • 非常感谢,成功了。我会再读一些,因为我仍然不明白为什么传递指向第一个元素的指针会溢出堆栈。
  • @kirbuchi:堆栈用于局部变量。您不是通过传递指针来溢出堆栈,而是通过尝试定义如此大的本地数组。我想在您尝试访问超出堆栈空间的元素之前,它根本不会出错......这发生在您的 foo() 函数中。
  • 我读了一些书,我想我现在明白了。结果发现堆栈空间用于局部变量,因此在调用 foo() 时,它会尝试在堆栈上分配 27MB。
【解决方案2】:

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

   (blocks, -c) 0

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

【讨论】:

  • 虽然确实如此,但将大量数据作为数组按值传递对性能来说是非常糟糕的。最好在堆上分配内存并传递一个指向它的指针,而不是增加堆栈大小,以便您可以将 27MB 的数据复制到堆栈中作为函数参数...
猜你喜欢
  • 2014-11-19
  • 2014-03-16
  • 2011-09-27
  • 1970-01-01
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多