变量声明导致分段错误

我不明白程序中出现分段错误的原因。 代码可在此处获得

在第29行,我声明了一个PclImage变量,使用typedef定义,类似于struct数组。 PclImage类型的定义如下(来自src / libMyKinect.h文件):

 typedef struct { int valid; float x; float y; float z; unsigned char blue; unsigned char green; unsigned char red; } Point3d; typedef Point3d PclImage[480][640]; 

该程序运行良好,但是当我声明第二个PclImage ,我一启动程序就会出现分段错误。

例如,如果在第一个文件的第30行,我添加了PclImage bgPcl; 程序立即崩溃。

谁能帮我?

如果将PclImage声明为局部变量(在堆栈上),则可能会因堆栈溢出而出现分段错误。

PclImage是一个包含307,200个元素的数组,每个元素(可能)大小约为20个字节,因此整个数组的大小约为6MB。 堆栈大小不足以包含其中两个数组; 它可能甚至不足以包含一个(作为一般规则,在大多数桌面操作系统上通常可以安全地假设您至少有1MB的堆栈空间可用)。

当你有这么大的对象时,你应该动态地分配它们(使用malloc和朋友),或者如果你不关心重入,静态地分配它们。

我同意James的意见,即在堆栈上分配这些大型数组很可能是原因。 但是,每个PclImage每个PclImage只有大约6Meg。 除非您在有限的内存环境中运行,否则这应该是可行的。 我以前在堆栈上分配了更大的数组。 甚至在嵌入式系统上。

詹姆斯建议使用malloc可能会解决它(值得一试只是为了validation问题)。 但是,我认为在可能的情况下避免动态分配是一个很好的策略。 malloc的可能替代方法是在外部上下文中声明数组,或者增加线程的堆栈大小。 默认情况下,用户创建的进程和/或线程通常会分配相当小的堆栈。 找到设置的位置并为其提供足够大的堆栈可能是一件相当简单的事情。

例如,如果从使用Windows CreateThread()例程创建的线程运行,则第二个参数控制堆栈大小。 如果将其默认为0 (与大多数人一样),则采用默认堆栈大小。 就像我所知,这是“仅”1 MB。