我正在开发一个实现C代码的C++项目,但在处理分段错误时遇到了困难。当我尝试在我的C++代码中访问全局C变量时,会出现分段错误。
代码概述:
我有一个名为video_stage.c的单个c文件,其中包含以下代码片段:
#include "video_stage.h"
uint8_t* pixbuf_data = NULL; //pointer to video buffer
vp_os_mutex_t video_update_lock = PTHREAD_MUTEX_INITIALIZER;
C_RESULT output_gtk_stage_transform( void *cfg, vp_api_io_data_t *in, vp_api_io_data_t *out)
{
vp_os_mutex_lock(&video_update_lock);
/* Get a reference to the last decoded picture */
pixbuf_data = (uint8_t*)in->buffers[0];
vp_os_mutex_unlock(&video_update_lock);
return (SUCCESS);
}
这个函数会被其他C代码周期性地调用,并更新pixbuf_data指针,该指针指向一个RGB视频帧。
它的头文件video_stage.h:
#ifndef _IHM_STAGES_O_GTK_H
#define _IHM_STAGES_O_GTK_H
#ifdef __cplusplus
extern "C" {
#endif
#include <config.h>
#include <VP_Api/vp_api_thread_helper.h>
#include <VP_Api/vp_api.h> //hier zit vp_os_mutex in geinclude
PROTO_THREAD_ROUTINE(video_stage, data);
#ifdef __cplusplus
}
#endif
extern uint8_t* pixbuf_data;
extern vp_os_mutex_t video_update_lock;
#endif // _IHM_STAGES_O_GTK_H
头文件包含了pixbuf_data指针的extern声明。
这里是cpp文件:device.cc:
#include <iostream>
#include "video_stage.h"
int ardrone_update(ardrone_t *d)
{
uint8_t x;
x = pixbuf_data[0]; //no problem here, this is executed
std::cout << 5 << std::endl; //this is executed too
std::cout << x << std::endl; //segfault occures here
}
当调用cpp文件中的函数(由其他cpp代码调用)时,在打印x的cout指令处发生了段错误。
当我在c文件中对缓冲区的第一个元素进行printf时,我得到了我所期望的结果。
我确信这与混合使用c和c++代码有关,但根据我所做的研究,我已经做了使c和c++代码兼容的工作。