浮动指针取消引用 ** 无法读取内存
Pointer Dereference Of float ** unable to read memory
我有一个 C++ class Matrix2,其中包含一个 public 方法 foo()
和一个受保护的成员 m
,在此处声明
public:
void foo();
protected:
float m[2][2];
假设数组 m 的全部内容在构造函数中被零初始化。
在某个地方的另一个函数中,我在堆栈上声明了一个 Matrix2。
Matrix2 MAT;
然后,在同一个函数中,我调用了一些函数 foo,这是 Matrix2 class 中的一个 public 函数。
MAT.foo();
在 foo() 中,我设置了
float ** u = (float **) m;
之后,在 foo 中,我打印出以下值。
cout << "m :: " << u << endl;
cout << "u :: " << m << endl;
cout << "&m[0][0] :: " << &(m[0][0]) << endl;
cout << "m[0][0] :: " << m[0][0] << endl;
cout << "u[0][0] :: " << u[0][0] << endl;
结果:u的mem地址与m的相同,也与&(m[0][0])相同。
使用 m[0][0] 解除对 m 的引用,如预期的那样打印出正确的值。
但是,使用 u[0][0] 取消引用 u 时,程序崩溃并且无法读取内存,即使指针应该指向相同的位置。
关于这是为什么的任何想法?
确实数组和指针在某种程度上可以互换,但它们需要引用相同的元素类型。此处,m
是 [float
的长度为 2 的数组] 的数组。如果要使用指针,只需使用正确的元素类型即可:
1 typedef float float_arr[2];
2
3
4 int main()
5 {
6 float m[2][2];
7
8 float_arr *p = m;
9
10 return 0;
11 }
我有一个 C++ class Matrix2,其中包含一个 public 方法 foo()
和一个受保护的成员 m
,在此处声明
public:
void foo();
protected:
float m[2][2];
假设数组 m 的全部内容在构造函数中被零初始化。
在某个地方的另一个函数中,我在堆栈上声明了一个 Matrix2。
Matrix2 MAT;
然后,在同一个函数中,我调用了一些函数 foo,这是 Matrix2 class 中的一个 public 函数。
MAT.foo();
在 foo() 中,我设置了
float ** u = (float **) m;
之后,在 foo 中,我打印出以下值。
cout << "m :: " << u << endl;
cout << "u :: " << m << endl;
cout << "&m[0][0] :: " << &(m[0][0]) << endl;
cout << "m[0][0] :: " << m[0][0] << endl;
cout << "u[0][0] :: " << u[0][0] << endl;
结果:u的mem地址与m的相同,也与&(m[0][0])相同。
使用 m[0][0] 解除对 m 的引用,如预期的那样打印出正确的值。
但是,使用 u[0][0] 取消引用 u 时,程序崩溃并且无法读取内存,即使指针应该指向相同的位置。
关于这是为什么的任何想法?
确实数组和指针在某种程度上可以互换,但它们需要引用相同的元素类型。此处,m
是 [float
的长度为 2 的数组] 的数组。如果要使用指针,只需使用正确的元素类型即可:
1 typedef float float_arr[2];
2
3
4 int main()
5 {
6 float m[2][2];
7
8 float_arr *p = m;
9
10 return 0;
11 }