【问题标题】:Calloc a Two-Dimensional ArrayCalloc 二维数组
【发布时间】:2015-04-30 20:20:21
【问题描述】:

为了制作一个二维数组,我目前正在使用以下内容:

int * own;

own = (int *)calloc(mem_size, sizeof(int));

for (i=0;i<mem_size;i++){
    own[i] = (int *)calloc(3, sizeof(int));
}

但是,每次我引用 own[i][j] 时,我都会收到一条错误消息,指出下标值既不是数组也不是指针也不是向量。

【问题讨论】:

  • own 应该是int**
  • 通常最好将二维数组建模为连续块并使用 i x 行 + j 来访问元素。考虑将此作为替代方案。
  • 更准确地说,这不是 2D 数组,而只是通过指向指针的指针来模拟这种东西。如果你必须这样做,请不要这样做。 int (*own)[n] = malloc(sizeof(int[m][n])); 是你所需要的一个像样的 C 编译器。
  • @JensGustedt:你应该这样回答——这绝不是一种显而易见的技术。事实上,我认为我以前从未见过它使用过。 (如果您有时间和兴趣,最好扩展一下什么是体面或不合适的编译器)。
  • @MichaelBurr,这不适合作为这里的答案,问题比这更具体。我也这样做了好几次,在上面写了博客,……,只是传播这个词。 gustedt.wordpress.com/2011/01/09/…

标签: c arrays calloc


【解决方案1】:

但是,每次我引用 own[i][j] 时,我都会收到一条错误消息,指出下标值既不是数组也不是指针也不是向量。

没错。 own[i] 等价于 *(own + i),其类型为 int。您不能将下标运算符应用于int

请注意,您的代码似乎试图创建的不是二维数组,而是指针数组。如果这确实是您想要的,那么own 应该具有int ** 类型,并且您应该相应地调整第一个calloc() 调用。但是,如果您真的想要动态分配 2D 数组,那将是:

int (*own)[3];

own = calloc(mem_size, sizeof(*own));

请注意,无需单独分配(或释放)行。

但是,请注意,如果您不需要在 own 超出范围之前重新分配它,如果您可以假设至少有一个 C99 编译器,并且如果 mem_size 永远不会太大,那么您可以通过变长数组更轻松地做到这一点:

int own[mem_size][3] = {{0}};

在这种情况下根本不需要显式的动态分配或释放,如果不需要,可以省略初始化程序。 (我包括了初始化程序,因为calloc() 执行分配空间的等效初始化。)“太大”应该解释为与堆栈上分配的数组有关。

【讨论】:

  • VLA 在堆栈上分配的标准警告,因此如果mem_size 是一个很大的数字,VLA 可能不是一个好主意。
  • @user3386109,谢谢,我已经更新了我的答案,加入了关于 VLA 堆栈分配的警告。
【解决方案2】:

用途:

int ** own; // int**, not int*
own = calloc(mem_size, sizeof(int*)); //int*, not int
                                      // And remove the explicit cast.

【讨论】:

    【解决方案3】:

    因为 own 被声明为具有类型int *

    int * own;
    

    那么own[i] 是一个int 类型的标量对象,你不能应用下标运算符。

    你可以这样写

    int ( *own )[3] = calloc( mem_size, 3 * sizeof( int ) );
    

    另一种方式如下

    int **own = malloc( mem_size * sizeof( int * ) );
    
    for ( i = 0; i < mem_size; i++ ) own[i] = calloc( 3, sizeof( int ) );
    

    【讨论】:

      【解决方案4】:

      二维数组的类型错误 - 很多人都指出了这一点。

      不同的建议解决方案。

      分配时,使用sizeof 变量而不是sizeof 类型。出错的可能性较小 - 更易于维护。

      //int * own;
      int **own;
      
      own = calloc(row_count, sizeof *own);
      for (i=0; i<row_count; i++){
        own[i] = calloc(column_count, sizeof *(own[i]));
      }
      

      【讨论】:

        【解决方案5】:
        int *own = calloc(100, sizeof(int));
        

        构建一个数组 内存中的二维数组是这样的 =>

        所以可以使用这样的公式来访问它

        *(own + rows*y +x)
        

        使用这种类型的数组非常简单和开放,例如当我们从内存中有 100 个单元格时,我们可以将其制成一个大小为 100 可整除的数组。
        例如,在 100 个家庭中,可以提供这种大小的数组 =>
        [1][100]= (自己的 + 1y +x)
        [2][50]= (自己的 + 2y +x)
        [4][25]= (自己的 + 4y +x)
        [5][20]= (自己的 + 5y +x)
        [10][10] = (自己的 + 10y +x)
        对不起,如果我说错了,因为我说波斯语而且我不太懂英语


        示例:
        int *aPtr = calloc(100, sizeof(int));
        for(int y=0;y<4;y++){
            for(int x=0;x<25;x++){
                *(own + 25*y +x) = 1;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-08-10
          • 1970-01-01
          • 2011-10-01
          • 1970-01-01
          • 2021-02-22
          • 2021-12-25
          • 2019-04-05
          相关资源
          最近更新 更多