C++ 为什么可以';我不能访问这个uchar阵列吗?

C++ 为什么可以';我不能访问这个uchar阵列吗?,c++,C++,守则: unsigned char data[20][20] = {{50, 50....}, .... ....}; Mat speed(20, 20, data); 当我尝试访问speed.data中的内容时,它会显示: speed tracking.exe中0x003D2094处引发异常:0xC0000005:访问冲突读取位置0x32323233 例如,std::coutMat需要一个平面数组,因此将类Mat中的无符号字符**数据替换为无符号字符* (x,y)处的数据可以

守则:

unsigned char data[20][20] = 
  {{50, 50....},
  ....
  ....};

Mat speed(20, 20, data);
当我尝试访问
speed.data
中的内容时,它会显示:

speed tracking.exe中0x003D2094处引发异常:0xC0000005:访问冲突读取位置0x32323233


例如,
std::cout
Mat
需要一个平面数组,因此将
类Mat
中的
无符号字符**数据
替换为
无符号字符*


(x,y)
处的数据可以使用
data+x*cols+y
Mat
访问,因为它需要一个平面数组,所以将
类Mat
中的
无符号字符**数据
替换为
无符号字符*


(x,y)
处的数据可以使用
data+x*cols+y

访问。事实上,由于左侧的类型为
unsigned char**
,而右侧的类型为
unsigned char(*)[20]
,因此您执行了错误的强制转换

假设在这种容易出错的强制转换之后,您尝试通过
Mat::data
访问一些数组元素,例如计算
Mat::data[0][1]
(当然,这是个坏主意)

回想一下,
Mat::data[0][1]=*(*(Mat::data+0)+1)

Mat::data+0
的类型为
unsigned char**
,值等于
data
数组的地址

然后
*(Mat::data+0)
的类型是
无符号字符*
和我们现在要计算的值

正如我从发布的崩溃报告中所看到的,在您的机器上,地址是4字节长的。因此,
data
数组的前4个元素被视为
*(Mat::data+0)
的值。然后我们添加1(
sizeof(char)
)并获得
*(Mat::data+0)+1
值。16进制中的结果等于0x32323233。之后,我们尝试从这个位置读取一些内容,这就是
SIGSEGV
的实际原因


最好使用
无符号字符*
存储数组第一个元素的地址,并使用已知的矩阵宽度和高度来获得适当的矩阵元素。

事实上,由于左侧的类型为
unsigned char**
,而右侧的类型为
unsigned char(*)[20]
,因此执行了不正确的强制转换赋值
Mat::data=data

假设在这种容易出错的强制转换之后,您尝试通过
Mat::data
访问一些数组元素,例如计算
Mat::data[0][1]
(当然,这是个坏主意)

回想一下,
Mat::data[0][1]=*(*(Mat::data+0)+1)

Mat::data+0
的类型为
unsigned char**
,值等于
data
数组的地址

然后
*(Mat::data+0)
的类型是
无符号字符*
和我们现在要计算的值

正如我从发布的崩溃报告中所看到的,在您的机器上,地址是4字节长的。因此,
data
数组的前4个元素被视为
*(Mat::data+0)
的值。然后我们添加1(
sizeof(char)
)并获得
*(Mat::data+0)+1
值。16进制中的结果等于0x32323233。之后,我们尝试从这个位置读取一些内容,这就是
SIGSEGV
的实际原因


最好使用
无符号字符*
存储数组第一个元素的地址,并使用已知的矩阵宽度和高度来获取适当的矩阵元素。

请发布一条消息,我无法重现您的错误。访问哪个索引?在哪里?定义数据变量的范围相同吗?在访问代码中是否正确地强制转换回无符号字符?数组不是指针,将数组(指向数组中第一个元素的指针)强制转换为指向另一种类型的指针将产生无效数据。请思考一下,
0x32
作为十进制值是什么?我们在哪里看到的?也许在初始化列表中?
char[20][20]
(数组数组数组)并不等同于指向
char
的指针。通过传递
void*
和强制转换到
char**
来隐藏事实并不能解决任何问题。@WhozCraig有什么好方法可以通过修改
class Mat
来解决它吗?请发布一个,我无法重现您的错误。访问哪个索引?在哪里?定义数据变量的范围相同吗?在访问代码中是否正确地强制转换回无符号字符?数组不是指针,将数组(指向数组中第一个元素的指针)强制转换为指向另一种类型的指针将产生无效数据。请思考一下,
0x32
作为十进制值是什么?我们在哪里看到的?也许在初始化列表中?
char[20][20]
(数组数组数组)并不等同于指向
char
的指针。通过传递
void*
并强制转换到
char**
来隐藏这个事实并不能解决任何问题。@WhozCraig有什么好方法可以通过修改
类Mat来解决它吗?
// two-dimensional matrix, type of data is unsigned char
class Mat {
 public:
  Mat(size_t rows_, size_t cols_, void* data_ = nullptr)
      : rows(rows_), cols(cols_), data((unsigned char**)data_) {}
  Mat() : rows(0), cols(0), data(nullptr) {}
  bool empty() const; // return true if data == nullptr
  size_t rows, cols; // the size of the matrix
  unsigned char** data; // the contents of the matrix
};