在结构中使用int(*)[4]时发生访问冲突
Access violation when using int (*)[4] in structure
我在代码中定义了整数数组:
unsigned int tara[1024][3];
unsigned int data[1024][4];
我有一个存储结构,允许我将它们作为void*
传递:
struct storage {
unsigned int (*data)[4];
unsigned int (*tara)[3];
};
这是我对上面结构的使用:
int main() {
unsigned int tara[1024][3];
unsigned int data[1024][4];
storage but_data;
but_data.data = data;
but_data.tara = tara;
tara_button.setCallback(taraButtonCallback, (void*)&but_data); //Some UI class
while(true); //The program
return 0;
}
在回调中,我是这样访问数据的:
bool taraButtonCallback(Opencv_Button* but, void* but_data)
{
storage* data_struct = (storage*)but_data;
int max = -5;
int max_value = 0;
cout<<data_struct->data[0][0]<<'n'; //!!ERROR!!
return true;
}
这是运行时错误我得到:
编辑:OpenCV.exe中0x00394f1c未处理异常:0xC0000005: 访问违反读取位置0x00000005.
这个问题与but_data
定义的位置无关!这个回调行得通:
bool taraButtonCallback(Opencv_Button* but, void* but_data)
{
storage* data = (storage*)but_data;
set_tara(data->data, data->tara, *data->mat);
*(data->tara_set) = true;
return true;
}
void set_tara(unsigned int data[][4], unsigned int tara[][3], Mat &UI_bot)
{
UI_bot = Scalar(0, 0, 0);
for(int x=0; x<cam_frame_width; x++) {
tara[x][0]=data[x][0];
tara[x][1]=data[x][1];
tara[x][2]=data[x][2];
}
}
当回调被调用时,but_data已经被销毁了:
storage but_data;
它是局部分配的,这意味着它的生命周期随着当前函数的结束而受到限制。函数完成后,它就不存在了,回调函数使用悬浮指针。
把它赋值给一个变量,然后打印出来
int taraButtonCallback(void* but_data)
{
struct storage* data = ( struct storage*)but_data;
int max = -5;
int max_value = 0;
int val = data->data[0][0];
cout <<val ; //!!works!!
return 0;
}
在这种情况下,我认为cout无法处理[][]。我不知道为什么有人能给我们俩开导
您可以尝试像这样分配变量storage but_data
:
storage *but_data = new storage;
有效地创建一个具有无限生命周期的变量。那么您将以稍微不同的方式定义回调函数(因为您已经有一个指针,因此不需要变量的地址)—像这样:
tara_button.setCallback(taraButtonCallback, (void*)but_data);
//note the lack of '&' sign before the but_data variable name
只是别忘了在你不再需要它后删除它!
delete but_data;
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- 访问在 C++ 结构中声明的枚举变量
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 尝试创建结构对象,在位置0x3FE00000中创建访问冲突写入错误
- 写入结构变量时发生strcpy访问冲突
- 读取位置/使用结构的矢量时发生未处理的异常访问冲突
- 当函数在fread()应用于局部结构变量后返回时发生访问冲突
- 使用结构和数组而不使用指针的访问冲突
- 内存访问冲突插入结构在树结构c++
- c++结构访问冲突
- 在c++中删除多维结构会导致访问冲突
- 抽象类层次结构和访问冲突
- 在结构中使用int(*)[4]时发生访问冲突