【发布时间】:2018-10-19 14:23:27
【问题描述】:
今天一位同事向我展示了一种声明 2D 数组的方法,这种方法可以线性分配它,但仍然使用 2D 方括号 ([][]) 表示法来访问元素。
例如:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 2
int main () {
int (*a)[SIZE][SIZE] = malloc (sizeof (int) * SIZE * SIZE);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
(*a)[i][j] = 0;
}
}
(*a)[0][1] = 100;
/* should yield:
* 0
* 100
* 0
* 0
*/
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf ("%d\n", (*a)[i][j]);
}
}
free (a);
return EXIT_SUCCESS;
}
这与计算索引然后执行指针算法(例如*(a + (x * SIZE + y)) 或更简洁的a[x * SIZE + y])来访问元素相反。
关键部分是指针x(例如(*x)[][])的形状声明,它似乎将此信息编码为x指向的值的类型。
除此之外,虽然我不明白这是如何工作的。这个符号到底在做什么?是语法糖吗?它看起来类似于数组的动态堆栈分配(参见Array size at run time without dynamic allocation is allowed? 作为其中的一个示例),但显然这种分配发生在堆上。
我已经查找了有关指针的这种表示法/声明的更多信息,但除了即将出现的术语 元素类型 之外找不到更多信息 - 但我不确定这是否相关.
编辑#1:
我应该提到这个问题是在使用堆而不是堆栈的上下文中。我知道基于堆栈的数组动态分配,但我正在做的工作专门着眼于动态内存分配。
【问题讨论】:
标签: c arrays multidimensional-array malloc c99