2012-11-10 255 views
0
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++填充零的

我在哪裏做錯了?

+0

同樣的問題:代碼定義了'int ** b',將一個值存儲到'this-> b'中,並訪問在頂部定義的'b'。 –

+0

啊,好的。我的錯。再次糾正。 – totten

+1

問題是[i] [j]意味着我* row_length + j。但是在這個例子中沒有定義row_length。你應該改變如何訪問單個元素,或者在堆棧上創建一個數組。 –

回答

2

b由於具有類型int**,表達b[i]點到偏移sizeof(int*)*i(b[i])[j]加上偏移sizeof(int)*j。您總共訪問的是偏移量爲sizeof(int*)*i + sizeof(int)*j的字節,與偏移量sizeof(int)*(i*j)的偏移量完全不同,該偏移量將用於確定平面一維數組中的索引。

您正在請求一維數組,但將其視爲二維數組。這是行不通的。像往常一樣,鑄造是怪罪。

2

您的代碼會分配b中的內存,但這不是您以後嘗試設置的內存。而是嘗試設置未分配的b

1

b未初始化,因此通過它進行訪問會產生未定義的行爲。

0

擺脫演員,然後找出你想分配什麼類型和什麼類型的變量來存儲它。劇組隱藏了一個錯誤。

1

真正的問題是,如果你使用b作爲一個二維數組,而不指定一個維度,編譯器不真正懂得它的索引訪問,嘗試寫這樣的:

int (* b)[12]; 
b = new int[5][12]; 

我們在這裏做什麼是聲明b作爲指針以一個12元件陣列,所以,當我們在索引i索引,編譯器知道它必須由12

+0

我無法更改int **,所以我用我現在發佈的答案解決了我的問題。 – totten

0

相乘問題[i][j]裝置i*row_length+j。但在本例中沒有定義row_length。你應該改變如何訪問單個元素,或者在堆棧上創建一個數組。