c语言定义可变大小二维数组,C中使用动态二维数组

本文介绍了在C语言中如何动态创建二维数组,通过malloc2d函数实现,该函数返回一个指向指针的指针,可以直接用m[x][y]访问元素。文章详细解析了数组的内存布局和访问原理,并提醒注意字节对齐问题,建议在index和数据区域之间添加padding以确保正确性。

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

a[j] =

dataStart + j * rowSize;

return a;

}

参数w,h是所申请二维数组的列数和行数,size是数组单元的字节数。比如,申请一个4*5的int型的二维数组,使用:

int **m = (int **) malloc2d(5, 5, sizeof(int));

直接使用m[x][y]即可以引用x行y列的值。

退回时,直接使用free(m)即可。

跟白老鼠开始的程序相比,改了一些地方,返值改成void **,(char *)(a + h)改成了(char *) a +

h。加进了一些循环外的计算。

解释一下~就好像原帖里面cromayen2000所讲的,动态申请二维数组通常需要一个index区域和一个数据区域。index区域保存每一行数据区域的首地址,数据区域存放实际的值。m的地址是index区域的首地址。

这样,对二维数组中x行y列元素的引用m[x][y],实际上是一个两步的运算。

首先,m是一个int**的元素。m[x]是*(m +

x),即index区域,第x个元素内的值,这个值就是数据区域第x行的起始地址。*(m + x)的类型是int*。

之后,寻找第y列的值。就是*(*(m + x) +

y)。正好对int**进行两次解除引用。得到一个int。而写成中括号的表示法,m[x][y] === *(*(m + x) +

y)。

白老鼠的函数把index和数据区域连在了一起。

+====+

+--+--* |〔0〕

|  |----|

+----+--* |〔1〕

| |  |----|

| |  ~    ~

| |  |----|

+------+--* |〔h-1〕

| | |  +====+

| | |

| |

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值