C语言-二维数组动态分配

如图,要求设计一个程序,为二维数组动态分配内存并且释放内存空间。pArray2=(int**)malloc(sizeof(int*[3]));为什么要这么分配空间,这是多大的空间?不是整个数组的吧。printf("%d\n",sizeof(int*[3]));为什么大小也是12,不是数组指针吗,指针大小不是固定值吗? *(pArray2+i)=(int*)malloc(sizeof(int[3]));这个for循环里为什么又分配一次空间?整个分配的过程就没看懂,请大神帮忙。

pArray2=(int**)malloc(sizeof(int*[3])); //分配了3个int*的空间,32地址环境下指针的长度都是32位的也就是4字节,那3个int*就是12字节,和3个int长度是一样的,凑巧而已
也可以写成这样:
pArray2=(int**)malloc(3*sizeof(int*)); //分配3个int*的空间
现在pArray2指向的有效空间内包含3个指针,这3个指针是int*,也就是指向int的指针,这3个指针的值是随机的,还不能用,先要让它们指向合适的空间才行
于是就有:
for(....)
*(pArray2+i)=(int*)malloc(sizeof(int[3])); //这就是给pArray2指向的空间内的3个指针校正方向,让每一个指针指向由3个int整数组成的数组的首地址,这才是最终的数据空间
和pArray2一样,也可以写成:
*(pArray2+i)=(int*)malloc(3*sizeof(int)); //3个int
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-01-15
为啥分配空间,指针大小不是固定值吗,这两个问题问的好,说明你爱思考啊
第一个问题:指针也是变量,变量是需要内存空间的,像int和string类型都要分配内存,都是都是在定义的同时自动分配好了,
第二个问题:如果第一个问题理解了,那么这个问题也就出来了,答案当然是相同的
第2个回答  2019-02-16
使用malloc函数,先分配第一维的大小,然后再循环分配每一维的大小。
示例代码,分配3行4列二维数组:
#include <stdio.h>
#include <malloc.h>
int main()
{
int **a;
int i, j;
a = (int**)malloc(sizeof(int*)*3);//为二维数组分配3行
for (i = 0; i < 3; ++i){//为每列分配4个大小空间
a[i] = (int*)malloc(sizeof(int)*4);
}
//初始化
for (i = 0; i < 3; ++i){
for (j = 0; j < 4; ++j){
a[i][j] = i+j;
}
}
//输出测试
for (i = 0; i < 3; ++i){
for (j = 0; j < 4; ++j){
printf ("%d ", a[i][j]);
}
printf ("\n");
}
//释放动态开辟的空间
for (i = 0; i < 3; ++i){
free(a[i]);
}
free(a);
return 0;
}
/*
输出:
0 1 2 3
1 2 3 4
2 3 4 5
*/
相似回答