通过glib队列传递数据结构

时间:2011-06-06 17:08:17

标签: c pointers queue segmentation-fault glib

我有另一个指针问题,所以如果你能帮助我解决这个问题我真的很高兴

我有这个结构:

uint8_t *reconstructed[3];

reconstructed[0] = buff_offset + (uint8_t *) malloc (buff_size);
reconstructed[1] = buff_offset + (uint8_t *) malloc (buff_size);
reconstructed[2] = buff_offset + (uint8_t *) malloc (buff_size);

我用这种方式使用这个变量:

y4m_write_frame (fd_out, &ostreaminfo, &oframeinfo, reconstructed);

我的任务是对这个应用程序进行并行化,原因有几个,我需要将这个结构放在一个GLib队列中,并在一些操作后使用它。

所以我把它放在队列中:

g_queue_push_tail(queue, (gpointer) reconstructed);

但现在我不知道如何从那里得到它。我试过了:

uint8_t * const * frame = (uint8_t * const *) g_queue_pop_head(queue);
y4m_write_frame (fd_out, &ostreaminfo, &oframeinfo, frame);

但是应用程序因Segmentation fault而失败。

任何人都能帮帮我吗?我没有得到整个指针问题。

2 个答案:

答案 0 :(得分:3)

您正在将堆栈上分配的内存推送到队列的末尾:

uint8_t *reconstructed[3];

然后尝试将其从其他地方拉出队列。当你把东西拉出队列时,你的三个元素reconstructed数组的堆栈空间几乎可以肯定用于其他东西。我认为您必须将reconstructed更改为uint8_t **并将其分配到堆上:

unint8_t **reconstructed;
reconstructed = malloc(3 * sizeof(uint8_t *));
/* Proceed as before. */

这将使reconstructed内存保持有效(当然除了其他错误)在声明它的函数之外。当你将它从队列中拉出并完成后,你还必须释放你的reconstructed值(及其元素);在释放时,请务必考虑reconstructed元素上的奇数偏移。

答案 1 :(得分:1)

好的,所以我也想通了 无论如何,我创建了我需要的包装器

// structure
struct wrapper {
    uint8_t *reconstructed[3];
    int should_reconstruct;
    int run_count;
};

// malloc wrapper
struct wrapper* link = (struct wrapper*) malloc(sizeof(struct wrapper));
link->reconstructed[0] = buff_offset + (uint8_t *) malloc (buff_size);
link->reconstructed[1] = buff_offset + (uint8_t *) malloc (buff_size);
link->reconstructed[2] = buff_offset + (uint8_t *) malloc (buff_size);

// add additional informations to wrapper
link->should_reconstruct = 0;
link->run_count = run_count;
g_queue_push_tail(queue, (gpointer) link);

当我需要在不同的命名空间中使用它时,我只是

struct wrapper* frame = (struct wrapper*) g_queue_pop_head(queue);
y4m_write_frame (fd_out, &ostreaminfo, &oframeinfo, frame->reconstructed);
// rest of the code

非常感谢您的观点和回复