int ** b;
b = (int **)(new int[5 * 12]);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 12; j++) {
b[i][j] = 0;
}
}
我得到access violation
錯誤的行兩個dimensinal陣列b[i][j] = 0;
C++填充零的
我在哪裏做錯了?
int ** b;
b = (int **)(new int[5 * 12]);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 12; j++) {
b[i][j] = 0;
}
}
我得到access violation
錯誤的行兩個dimensinal陣列b[i][j] = 0;
C++填充零的
我在哪裏做錯了?
b
由於具有類型int**
,表達b[i]
點到偏移sizeof(int*)*i
和(b[i])[j]
加上偏移sizeof(int)*j
。您總共訪問的是偏移量爲sizeof(int*)*i + sizeof(int)*j
的字節,與偏移量sizeof(int)*(i*j)
的偏移量完全不同,該偏移量將用於確定平面一維數組中的索引。
您正在請求一維數組,但將其視爲二維數組。這是行不通的。像往常一樣,鑄造是怪罪。
您的代碼會分配b
中的內存,但這不是您以後嘗試設置的內存。而是嘗試設置未分配的b
。
b
未初始化,因此通過它進行訪問會產生未定義的行爲。
擺脫演員,然後找出你想分配什麼類型和什麼類型的變量來存儲它。劇組隱藏了一個錯誤。
真正的問題是,如果你使用b作爲一個二維數組,而不指定一個維度,編譯器不真正懂得它的索引訪問,嘗試寫這樣的:
int (* b)[12];
b = new int[5][12];
我們在這裏做什麼是聲明b作爲指針以一個12元件陣列,所以,當我們在索引i索引,編譯器知道它必須由12
我無法更改int **,所以我用我現在發佈的答案解決了我的問題。 – totten
相乘問題[i][j]
裝置i*row_length+j
。但在本例中沒有定義row_length
。你應該改變如何訪問單個元素,或者在堆棧上創建一個數組。
同樣的問題:代碼定義了'int ** b',將一個值存儲到'this-> b'中,並訪問在頂部定義的'b'。 –
啊,好的。我的錯。再次糾正。 – totten
問題是[i] [j]意味着我* row_length + j。但是在這個例子中沒有定義row_length。你應該改變如何訪問單個元素,或者在堆棧上創建一個數組。 –