最近复习考研,重新看了一遍C语言,在学到二维数组的时候,想着如何能够动态的申请二维数组呢
于是上网搜索了一下,网上大部分答案我是不敢苟同的,他们是这么实现的(以建立一个3*4数组为例):
int **p = malloc(3*sizeof(int*)),i;
for(i=0;i<4;i++){
p[i]=malloc(4*sizeof(int));
先不说这方式根儿上的毛病,就看它如何free就知道有毛病
for(i=0;i<4;i++)
free(p[i]);
free(p);
----------------------------------------------------------------------------------
可能很多人都遗漏了一个C语言二维数组的知识,那就是C语言的二维数组是连续存放的,比如int p[3][4]这个数组,在内存中就是p[0][0],p[0][1],p[0][2],p[0][3],p[1][0],p[1][1],p[1][2],p[1][3],p[2][0],p[2][1],p[2][2],p[2][3]这么排列的,并不是说p[0]里面存了又保存了一个4个元素的一维数组
这也就是说,*p[0]其实并不存在,只是为了表示的方便。
另外一个容易被忽视的东西就是 p+1 的值其实就是p[1] +1便加了4个元素的空间,这说明p的类型不是一个指向指针的指针,而是一个指向大小为4的int数组的指针
由此推测,p的类型应该是int(*)[4]
根据这个推测,我们也就可以推测出一个更适合的动态申请二维数组的方法
int (*p)[4]=malloc(3*4*sizeof(int));
free(p);
当然如果行列都是变量的话也是一样的
int (*p)[cloumn] = malloc(row*column*sizeof(int));
free(p);
个人认为这样动态申请二维数组才是比较合理的,因为它的指针用法也更符合原来的二维数组,而且它在free的时候也不用这么麻烦
当然。。。这是我的个人只见,可能我学的不够深入。。。。如果错了,欢迎及时告诉我,免得误导了别人哈。