访问二维点阵C中的元素

时间:2014-12-13 02:20:51

标签: c arrays pointers segmentation-fault

为什么我不能在不引发seg故障的情况下使用[] []访问Lattice?

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;
    }
}

我将此解释为;

我的指针是一维高度数组

然后我设置Lattice以便可以存储长度 - LatticeHeight的多个副本(制作网格)

然后我访问晶格的每个元素并将其值设置为0

此外,有人可以解释为什么这种方法适用于1D但不适用于2D,即

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

不抛出段错误

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您必须为Lattice分配内存,这是指向int的指针。

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

然后遍历你刚刚创建的int指针的“数组”并为每个指针分配内存,就像这样。

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

有了这个你就会有一个二维“数组”。

尽管如Matt McNabb所说,还有其他选择可以做什么。

答案 2 :(得分:0)

我认为你应该像这样初始化你的数组:

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