malloc 2D阵列的另一种方法是什么?

时间:2013-06-30 09:36:12

标签: c arrays malloc

我想使用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");
    }
}

3 个答案:

答案 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;

}

这是分配和使用具有二维维度

的数组的最简单方法