浮点指针解除引用**无法读取内存

时间:2015-12-27 07:39:59

标签: c++ pointers dereference

我有一个C ++类Matrix2,其中包含一个公共方法foo()和一个受保护的成员m,在此处声明

 public:

 void foo();

 protected:

 float m[2][2];

假设数组m的全部内容在构造函数中初始化为零。

在某个地方的另一个函数中,我在堆栈上声明了一个Matrix2。

Matrix2 MAT;

然后,在同一个函数中,我将一些函数foo称为Matrix2类中的公共函数。

 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;

结果:你的记忆地址与m相同,以及与&amp;(m [0] [0])相同。

使用m [0] [0]取消引用m,该值打印出正常,如预期的那样。

但是,使用u [0] [0]取消引用u时,即使指针指向同一位置,程序也会崩溃并无法读取内存。

关于这是为什么的任何想法?

1 个答案:

答案 0 :(得分:0)

数组和指针确实可以互换,但它们需要引用相同的元素类型。这里,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 }