malloc 2Darrays的另一种方式?

我想使用malloc声明一个2d数组。 在互联网上查找时,所有网站都会声明一个int **指针,然后使用malloc首先将各个指针分配给1d数组,然后再次使用malloc为单个int分配空间。 我怀疑的是,以这种方式声明的数组不会将其元素保存在连续的内存地址中。 以下方式仅使用一个malloc语句并动态分配2d数组,并且所有地址都是连续的。 所以不应该以下是动态分配2d数组的正确方法吗?

#include  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"); } } 

所以不应该以下是动态分配2d数组的正确方法吗?

它应该,因为这种方法相当于声明一个多维度的“静态分配”数组。

这样做的原因就是这样,你得到一个连续的内存块,这很方便(你不能在指向指针的指针上使用memset() ,对吗?),你仍然可以让编译器执行指针算术和数组下标计算(这也很方便)。

顺便说一下,如果您需要一个动态大小的数组,其范围仅在一个函数内,即您不需要返回它,请考虑使用具有自动存储持续时间的VLA(可变长度数组)。

您的2D数组不是完全动态的,因为其中一个维度固定为两个元素。 (在您的特定示例中,您可以使用可变长度数组,但通常您可能希望能够从函数返回已分配的数组。)

如果你想要一些语法上像2D M×N数组一样的东西,完全动态分配,并使用连续的内存,你可以分配一个M * N元素的内存块然后分配一个M指针数组,其中每个元素指向到M * N块的“行”。

来自comp.lang.c FAQ的Q6.16有一个很好的图表和更详细的解释。

(好吧,它不是完全连续的,因为指针数组和项目块是分开的。你可以将它们分配在一起,虽然这很棘手,因为它需要一些额外的工作来保证正确的对齐。)

换一种说法 :

包括

包括

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;

}

这是分配和使用具有二维维度的数组的最简单方法