如何动态分配一个二维数组

4
我希望能在C语言中创建一个二维数组。
例如,我可以像这样创建一个名为place的int类型变量:
int *place;

我有一个游戏,其中有像行和列这样的变量。 我希望我的位置变量是一个二维数组,其行和列可以进行动态分配(对于数组的最大大小),在“正常”声明中将如下所示:
place[rows][columns];

但是我不知道如何使用动态分配来实现它。
对于一维数组,我会像这样做:
place = (int*) malloc (levels * sizeof(int));

但我不知道如何使用二维数组实现这一点。

编辑:

如何将其改写为char而不是int?

我试过用char来覆盖int,但它不起作用。


你能展示一下你尝试使用char的代码,并说明它为什么不起作用吗?所有答案都独立于基本类型,你只需要在适当的位置替换类型名称即可。 - Daniel Fischer
我创建了一个变量,如下所示: char place;然后: (*place)[columns] = malloc(rows * sizeof *place);但它不起作用,说place的类型冲突。 - Zwiebel
不,语法(在我看来确实不是很好的语法)是char (*place)[columns];,用于声明place为指向columns个字符数组的指针,即char (*)[columns]。您可以像通常一样在声明时立即初始化,例如:char (*place)[columns] = malloc(rows * sizeof *place); - Daniel Fischer
我尝试过了,现在它说初始化元素不是常量。 我已经尝试将列和行设置为常量,但也不好。 - Zwiebel
当其中一个函数调用另一个函数时,如果它自己作为数组接收到了参数,则可以毫不问题地将该数组作为参数传递。在顶级调用者中声明它,并将其作为参数传递给需要该数组的函数。 - Daniel Fischer
显示剩余3条评论
3个回答

10

place成为一个指向数组的指针,

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

这将为您提供一块连续的内存块(有利于局部性),您可以通过以下方式简单地访问:

place[i][j] = whatever;

1
@AshRj place 被声明为 int (*)[columns],即指向包含 columnsint 的数组的指针。然后,您为 place 指向的类型的 rows 个对象分配内存。 - Daniel Fischer
@user590898 place 然后指向一个数组(由 columns 个整数组成),因此 sizeof *place == columns * sizeof(int),因此您总共分配了 rows*columns*sizeof(int) 字节。 - Daniel Fischer
@DanielFischer 如果我执行*place,那么我能访问place[0][0]吗? - asheeshr
如果是这样,那么为什么 sizeof(*place) 不等于 sizeof(int) 呢? - asheeshr
@AshRj 不,*place 将是一个 columnsint 的数组 place[0]**place 将带您到 place[0][0] - Daniel Fischer
显示剩余3条评论

0
你需要按照以下步骤动态分配 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));

首先的想法是创建一个指针的一维数组,然后对于每个数组条目,再创建另一个一维数组。


0
你可以通过一些巧妙的索引,将单个1d数组用作2d数组:
分配内存:
place = (int*) malloc(rows * columns * sizeof(int));

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

place[ i*columns + j] = value ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接