【发布时间】:2013-06-27 15:52:34
【问题描述】:
我想使用 malloc 声明一个二维数组。在互联网上查找时,所有网站都告诉声明一个 int ** 指针,然后使用 malloc 首先将各个指针分配给一维数组,然后再次使用 malloc 为各个 int 分配空间。我怀疑以这种方式声明的数组不会将其元素保存在连续的内存地址中。而以下方式仅使用一个 malloc 语句并动态分配一个二维数组,并且所有地址都根据需要是连续的。那么以下不应该是动态分配二维数组的正确方法吗?
#include <stdio.h>
int main(){
int (*p)[2] = malloc(3 * sizeof *p);
int i;
int j;
//All addresses printed here are contiguous
for(i=0; i<3; i++){
for(j=0; j<2; j++){
printf("%d\t", &p[i][j]);
}
printf("\n");
}
}
【问题讨论】:
-
这是分配二维数组的正确方法;您之前描述的是一个锯齿状数组,但是,如果您不存储各个子数组的长度,那么它几乎没有用;将幻数
24更改为3 * sizeof *p就可以了 -
您不应该使用
%d打印指针,但有%p用于此目的,并且为了完全可移植性,您还必须转换为void* -
为什么在引用数组元素时使用
&p?是否打算检查地址而不是值?
标签: arrays c multidimensional-array malloc