【问题标题】:How to dynamic allocate a two dimensional array如何动态分配二维数组
【发布时间】:2012-12-01 11:36:24
【问题描述】:

我想用 C 创建一个二维数组。

例如,我创建了一个名为 place 的 int 类型变量,如下所示:

int *place;

我有一个游戏,其中包含行和列等变量。 我希望我的 place 变量是一个二维数组,其行和列的动态分配(对于数组的最大大小),在“正常”声明中看起来像这样:

place[rows][columns];

但我不知道如何使用动态分配。

对于一维数组我会这样做:

place = (int*) malloc (levels * sizeof(int));

但我不知道如何处理二维数组。

编辑:

如何用 char 而不是 int 重写它?

我试图用字符覆盖整数,但它不起作用。

【问题讨论】:

  • 您能否展示一下您尝试将它用于chars 并说明它是如何不起作用的?所有答案都独立于基本类型,您只需在适当的位置替换类型名称。
  • 我做了一个这样的变量:char place;然后: (*place)[columns] = malloc(rows * sizeof *place);但它不起作用,比如地点类型冲突
  • 不,语法(诚然不是一个好的语法,IMO)是 char (*place)[columns];place 声明为指向 columns chars 数组的指针,char (*)[columns]。您可以像往常一样在声明后立即初始化,char (*place)[columns] = malloc(rows * sizeof *place);
  • 我试过了,现在说初始化元素不是常量。我尝试将列和行设为常量,但也不好。
  • 如果它抱怨初始化器不是常量,这意味着您的对象具有静态存储持续时间。这改变了事情。 a) 静态对象需要用于初始化程序的常量表达式,b) 静态对象不能具有可变修改的类型。如果columns可以是一个常量表达式,你仍然可以声明char (*place)[columns];,并且1.如果它在文件范围内,mallocmain中,2.如果它有函数范围,有一个静态保护变量和malloc 首次调用该函数时。如果rowscolumns 两者都可以是常量表达式,请使用char place[rows][columns];

标签: c multidimensional-array


【解决方案1】:

place 成为指向数组的指针,

int (*place)[columns] = malloc(rows * sizeof *place);

这为您提供了一个连续的内存块(有利于局部性),您可以轻松地访问它

place[i][j] = whatever;

【讨论】:

  • +1 这是用括号括起来的例子之一 *place 在视觉上会有很大帮助。
  • 但是有了这个解决方案,我怎么能 malloc 列呢?它不会只 malloc 行吗?我的意思是,如果我想在游戏的每个关卡中更改行和列,那么如何使用它来更改行和列的值?
  • @AshRj place 被声明为int (*)[columns],一个指向columnsints 数组的指针。然后为rows 类型的place 指向的对象分配内存。
  • @user590898 place 然后指向一个数组(columns 整数),所以sizeof *place == columns * sizeof(int),因此您总体分配rows*columns*sizeof(int) 字节。
  • @DanielFischer 如果我做 *place,那么我会访问 place[0][0] 吗?
【解决方案2】:

您可以通过一些智能索引将单个一维数组用作二维数组:

分配内存:

place = (int*) malloc(rows * columns * sizeof(int));

要访问place[i][j],请使用 i 和 j 作为:

place[ i*columns + j] = value ;

【讨论】:

    【解决方案3】:

    您需要执行以下操作来动态分配 int 类型的 arr[x][y]:

     int i = 0;
     int **arr = (int**)calloc(x, sizeof(int*));
     for(i = 0; i < x; i++)
          arr[i] = (int *) calloc(y, sizeof(int));
    

    这个想法是首先创建一个一维指针数组,然后为每个数组条目创建另一个一维数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 2013-11-24
      • 1970-01-01
      • 2014-03-15
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多