2015-12-27 85 views
0

我有一個C++類矩陣2包含一個公共方法,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; 

結果:U的MEM地址是相同的M的,以及相同&(M [0] [0])。

使用m [0] [0]解引用m,該值按預期打印出來。

但是,使用u [0] [0]解引用u,即使指針指向相同的位置,程序也會崩潰並且無法讀取內存。

任何想法,爲什麼這是?

+2

某種類型的數組的數組* *與指向某種類型的指針的指針相同。見例如[這是我的舊答案](http://stackoverflow.com/questions/18440205/casting-void-to-2d-array-of-int-c/18440456#18440456)的解釋。 –

+0

你的'm'不是一個指向浮點數的指針數組;它是兩項浮點數組的兩項數組,因此符號'm'是'(float [2])*',而不是'float **'類型。如果要在不使用數組語法的情況下轉儲數組值,則可以將'm'轉換爲'float *',假設整個數組內容都存儲在內存中的連續位置。但是,這是在問問題...... – CiaPan

+0

你在你的方法中犯了一個致命的錯誤:鑄造。如果任務的雙方不匹配,你應該考慮爲什麼是這種情況,並改變任何一方到正確的類型,而不是施加暴力(這是一種C風格演員等同於什麼),以便使編譯器忽略此錯誤。 –

回答

0

確實,數組和指針可以互換,但它們需要引用相同的元素類型。這裏,m是[數組長度爲2的float]的數組。如果要使用指針,只需使用正確的元素類型:

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 } 
+0

當你需要使用演員時學習。你的問題是'float ** u =(float **)m;'。事實上,你需要在這裏進行劇組編輯,應該是一個警告,你有錯誤的東西。 –