我有另一个指针问题,所以如果你能帮助我解决这个问题我真的很高兴
我有这个结构:
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而失败。
任何人都能帮帮我吗?我没有得到整个指针问题。
答案 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
非常感谢您的观点和回复