C语言 二维数组(指针)动态分配和释放

    转载自:

        https://blog.csdn.net/jzj_c_love/article/details/82596149

 

C 二维数组(指针)动态分配和释放

(1)已知二维

char (*a)[N];    //指向数组的指针

a = (char (*)[N])malloc(sizeof(char *) * m);

printf("%d\n", sizeof(a));   //4,指针

printf("%d\n", sizeof(a[0]));//N,一维数组

free(a);

 

(2)已知第一维

char* a[M];    //指针的数组

int i;

for(i=0; i<M; i++)

    a[i] = (char *)malloc(sizeof(char) * n);

printf("%d\n", sizeof(a));   //4*M,指针数组

printf("%d\n", sizeof(a[0]));//4,指针

for(i=0; i<M; i++)

    free(a[i]);

(3)已知第一维,一次分配内存(保证内存的连续性)

char* a[M];    //指针的数组

int i;

a[0] = (char *)malloc(sizeof(char) * M * n);

for(i=1; i<M; i++)

    a[i] = a[i-1] + n;

printf("%d\n", sizeof(a));   //4*M,指针数组

printf("%d\n", sizeof(a[0]));//4,指针

free(a[0]);

 

(4)两维都未知

char **a;

int i;

a = (char **)malloc(sizeof(char *) * m);     //分配指针数组

for(i=0; i<m; i++)

{

    a[i] = (char *)malloc(sizeof(char) * n); //分配每个指针所指向的数组

}

printf("%d\n", sizeof(a));    //4,指针

printf("%d\n", sizeof(a[0])); //4,指针

for(i=0; i<m; i++)

{

    free(a[i]);

}

free(a);

(5)两维都未知,一次分配内存(保证内存的连续性)

char **a;

int i;

a = (char **)malloc(sizeof(char *) * m);    //分配指针数组

a[0] = (char *)malloc(sizeof(char) * m * n);//一次性分配所有空间

for(i=1; i<m; i++)

{

    a[i] = a[i-1] + n;

}//采用如上内存分配方法,意味着将a的值初始化为m*n的二维数组首地址,且这块内存连续

printf("%d\n", sizeof(a));    //4,指针

printf("%d\n", sizeof(a[0])); //4,指针

free(a[0]);

free(a);

 

posted @ 2019-05-13 21:27  博客园—哆啦A梦  阅读(1894)  评论(0)    收藏  举报