我昨天遇到了一个关于 SO 的问题,它想在 C 中动态分配一个二维数组。
答案之一是以这种方式分配它:
int (*place)[columns] = malloc(rows * sizeof *place);
这除了漂亮之外,还给我带来了一个问题。问题如下:
以下是我分配 4x4 的代码
int (*arr)[4] = (int (*)[4]) malloc(4 * sizeof *arr);
printf("%d\n", sizeof arr); //Dynamic 2-D array by above method
int **arr1 = (int**) malloc(4 * sizeof(int*));
for(int i = 0; i < 4; i++)
arr1[i] = (int *) malloc(sizeof(double));
printf("%d\n", sizeof arr1); //Usual dynamic 2-D array
int *arr2 = (int*) malloc(4 * sizeof(int));
printf("%d\n", sizeof arr2); //Dynamic 1-D array
通常的输出是:
4
4
4
但是,如果我尝试打印sizeof *arr
,sizeof *arr1
和sizeof *arr2
,则输出为:
16
4
4
我不明白为什么会这样。知道为什么输出sizeof *arr
是16
吗?在第一种情况下如何分配内存?
另外,当我尝试打印 and 的地址时arr
,*arr
两个打印的值都是相同的。*arr
意思是“价值” arr
。那么这是否意味着 arr 存储自己的地址,即它指向自己(我认为这是不可能的)?我有点困惑。知道我哪里错了吗?
谢谢你的帮助!