2014-12-13 40 views
0

爲什麼我不能使用[] []來訪問萊迪思而不引發seg故障?在二維點陣中訪問元素C

int *LatticeHeight; 
int **Lattice; 

LatticeHeight = (int*)malloc(Height*sizeof(int)); 

Lattice = (int**)malloc(Length*sizeof(LatticeHeight)); 

for(i=0;i<Height; i++) 
    { 
    for(j=0; j<Length; j++) 
    { 
     Lattice[j][i] = 0; 
    } 
} 

我將其解釋爲;

我有指針高度

的一個維陣列。然後我設置格子使得可以存儲LatticeHeight的長度 - 許多拷貝(使網格)

然後我訪問晶格的每個元素並設置它的值設置爲0

而且有人能解釋爲什麼這THR工作在1D但不是在2D,即

for(i=0;i<Height;i++) 
{ 
    LatticeHeight[i] = 0; 
} 

不ow a seg fault

回答

2

您沒有正確分配數組。你的第一個malloc分配一行;你的第二個malloc分配空間來存儲一個指向每一行的指針,但它實際上並沒有分配任何行進入那裏(並且它沒有任何關聯到你之前分配的單行)。

寫這個代碼,如果你不要求有不同長度的排彼此最簡單的方法,是分配一個內存塊:

int (*Lattice)[Length] = calloc(Height, sizeof *Lattice); 

如果你想有一個鋸齒狀陣列由於某種原因(即每排在單獨的內存塊分配),那麼代碼是:

int **Lattice = malloc(Height * sizeof *Lattice); 
for (size_t row = 0; row != Height; ++row) 
    Lattice[row] = calloc(Length * sizeof **Lattice); 

注意calloc分配內存,也歸零,所以你不需要你的零循環之後,和don't cast malloc

+0

「高度」是行數,而「長度」是列數是用C通常的慣例,我建議採用它可以防止任何人在項目中工作:) – 2014-12-13 03:39:24

0

您必須爲Lattice分配內存,這是指向指向int的指針。

Lattice = malloc(Length * sizeof(LatticeHeight)); 

然後通過指針「數組」迭代爲int您剛纔已經創建併爲每一個分配內存,是這樣的。

for(i = 0; i < Lenght; i++) 
    LatticeHeight = malloc(Height * sizeof(int)); 

因此,你將有一個二維「數組」。

雖然,正如馬特麥克納布說的,還​​有其他的選擇可以讓你做什麼。

0

我想你應該初始化數組是這樣的:

Lattice = (int**)malloc(Length*sizeof(int*)); 
for(int i = 0; i < Length; ++i) { 
    LatticeHeight = (int*)malloc(Height*sizeof(int)); 
}