11

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

在第 29 行,我声明了一个PclImage变量,用 typedef 定义,就像一个结构数组。类型定义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;程序会立即崩溃。

谁能帮我?

4

2 回答 2

14

如果将 a 声明PclImage为局部变量(在堆栈上),则很可能由于堆栈溢出而导致分段错误。

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

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

于 2010-12-28T16:22:57.607 回答
1

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

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

例如,如果这是从使用 WindowsCreateThread()例程创建的线程运行的,则第二个参数控制堆栈大小。如果您将其默认为 a 0(正如大多数人所做的那样),它将采用默认的堆栈大小。据我所知,这“只有”1 MB。

于 2010-12-28T16:34:12.550 回答