变量声明导致分段错误

时间:2010-12-28 16:20:49

标签: c segmentation-fault typedef variable-declaration

我不明白程序中出现分段错误的原因。 该代码可用here

在第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;,程序会立即崩溃。

任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:14)

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

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

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

答案 1 :(得分:1)

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

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

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