2014-12-13 43 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)); 
}