如何正确地动态申请二维数组

本文探讨了C语言中动态申请二维数组的正确方法,纠正了常见的误解,并提出了一种更为合理且易于理解的实现方式。通过实例解析,帮助读者避免常见的编程陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近复习考研,重新看了一遍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的时候也不用这么麻烦

当然。。。这是我的个人只见,可能我学的不够深入。。。。如果错了,欢迎及时告诉我,免得误导了别人哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值