【问题标题】:Accessing elements in a two dimensional lattice C访问二维晶格 C 中的元素
【发布时间】:2014-12-13 02:20:50
【问题描述】:

为什么我不能使用 [ ][ ] 访问 Lattice 而不会引发 seg 错误?

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 的 Length-many 副本(制作网格)

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

此外,有人可以解释为什么这在 1D 中有效,但在 2D 中无效,即

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

不抛出段错误

【问题讨论】:

    标签: c arrays pointers segmentation-fault


    【解决方案1】:

    您没有正确分配数组。您的第一个 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

    【讨论】:

    • "height" 是行数,而 "length" 是列数是 C 中的常用约定,我建议您采用它,以防您在项目中与其他人一起工作:)
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

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

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

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

      尽管正如马特·麦克纳布所说,您想要做的事情还有其他选择。

      【讨论】:

        猜你喜欢
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-24
        相关资源
        最近更新 更多