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;
}
这是分配和使用具有二维维度的数组的最简单方法