为什么我不能在不引发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;
}
不抛出段错误
答案 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));
}