我有一個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,即使指針指向相同的位置,程序也會崩潰並且無法讀取內存。
任何想法,爲什麼這是?
某種類型的數組的數組* *與指向某種類型的指針的指針相同。見例如[這是我的舊答案](http://stackoverflow.com/questions/18440205/casting-void-to-2d-array-of-int-c/18440456#18440456)的解釋。 –
你的'm'不是一個指向浮點數的指針數組;它是兩項浮點數組的兩項數組,因此符號'm'是'(float [2])*',而不是'float **'類型。如果要在不使用數組語法的情況下轉儲數組值,則可以將'm'轉換爲'float *',假設整個數組內容都存儲在內存中的連續位置。但是,這是在問問題...... – CiaPan
你在你的方法中犯了一個致命的錯誤:鑄造。如果任務的雙方不匹配,你應該考慮爲什麼是這種情況,並改變任何一方到正確的類型,而不是施加暴力(這是一種C風格演員等同於什麼),以便使編譯器忽略此錯誤。 –