9

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

3 回答 3

5

那么以下不应该是动态分配二维数组的正确方法吗?

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

这样做的原因是,通过这种方式,您可以获得一个连续的内存块,这很方便(您不能memset()在指针对指针上使用,对吗?),您仍然可以让编译器进行指针运算和为您计算数组下标(这也很方便)。

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

于 2013-06-30T11:38:37.407 回答
2

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

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

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

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

于 2013-06-30T12:01:38.423 回答
-3

换句话说 :

include < stdio.h>
include < stdlib.h>
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 )** );
 return 0 ;
}

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

于 2013-06-30T11:31:48.937 回答