我想使用malloc声明一个二维数组。在互联网上查找时,所有网站都会声明一个int **指针,然后使用malloc首先将各个指针分配给1d数组,然后再次使用malloc为单个int分配空间。我怀疑的是,以这种方式声明的数组不会将其元素保存在连续的内存地址中。以下方式仅使用一个malloc语句并动态分配2d数组,并且所有地址都是连续的。所以不应该以下是动态分配二维数组的正确方法吗?
#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");
}
}
答案 0 :(得分:3)
以下是否应该是动态分配2d数组的正确方法?
它应该,因为这个方法 等同于声明多个维度的“静态分配”数组。
这样做的原因就是这样,你得到一个连续的内存块,这很方便(你不能在指针到指针上使用memset()
,对吗?),你仍然可以让编译器为你做指针算术和数组下标计算(这也很方便)。
顺便说一句,如果你需要一个动态大小的数组,其范围只在一个函数内,i。即你不需要返回它,考虑使用具有自动存储持续时间的VLA(可变长度数组)。
答案 1 :(得分:1)
您的2D数组不是完全动态的,因为其中一个维度固定为两个元素。 (在您的特定示例中,您可以使用可变长度数组,但通常您可能希望能够从函数返回已分配的数组。)
如果你想要一些语法上像2D M×N 数组的东西,完全动态分配,并使用连续的内存,你可以分配一个M * N
元素的内存块和然后分配一个 M 指针数组,其中每个元素指向M * N
块的“行”。
Q6.16 from the comp.lang.c FAQ有一个很好的图表和更详细的解释。
(好吧,它不是完全连续的,因为指针数组和项目块是分开的。你可以将它们分配在一起,虽然这很棘手,因为它需要一些额外的工作来保证正确对齐。)
答案 2 :(得分:-1)
:
包括&lt; stdio.h中&GT;
包括&lt;文件stdlib.h&GT;
const int MAXX = 10;
const int MAXY = 10;
int main(){
int * p =(int *)malloc( MAXX * MAXY );
int x = 3;
int y = 4;
*(p + MAXX * x + y) = 12;
printf(“\ n%d”, *(p + MAXX * x + y));
返回0;
}
这是分配和使用具有二维维度
的数组的最简单方法