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〕

| | |  +====+

| | |

| | |   〔0〕              〔w-1〕

| | |  +======================+

| | +->|                      |〔0〕

| |    |----------------------|

| +--->|                      |〔1〕

|      |----------------------|

|      ~                      ~

|      |----------------------|

+----->|                      |〔h-1〕

+======================+

嗯,这个ASCII图画的真是绝妙。佩服台湾的技术人员。

首先,区域的总长度h * sizeof(void *) + h * rowSize。前一个加数就是index区域的长度。即h个void

*指针的长度。后面的加数就是数据区的长度,h个rowSize。

数据区的开始也就是开始指针后移整个index区后的地址。即地址dataStart。循环把后面的数据区每一行开始地址连接到前面的index区域。

一个malloc,一个free,一个二维数组,妙哉~

这个方法要比直接栈上申请多一个index区域,思路和申请w * h大小的区域然后算出每一个元素地址根本不一样。

帖子的后面讨论了一下字节对齐的问题。白老鼠应该是藐视了字节对齐的重要性了。稍微弄一下SSE也会有感觉,字节不对齐的话会不见血的死掉的。按照这个函数,只需要保证数据区的字节对齐就可以了。方法是在index和数据区域之间加上padding。白老鼠随手写出来的程序疑似有问题。自己写了一个。

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

  1. java打印二维数组_Java中如何打印二维数组

    在Java中如何打印二维数组 1.直接使用数组自带的toString------ 打印出数组的地址 2.使用Arrays.toString()---------- 打印每个二维数组的地址 3.使用Ar ...

  2. 如何在Canva设计海报,并应用有设计感的动态二维码?

    作为一款专业的在线平面设计软件,Canva因其多样的模板.丰富的设计和简单的界面赢得了全球众多用户的喜爱. 即使是没有设计背景的用户,一样可以在Canva上轻松制作出自己需要的设计作品,如活动海报.公 ...

  3. 动态二维码刷卡触摸按键门禁一体机性能与选型攻略

    二维码门禁设备涉及到动态二维码.静态二维码.涉及IC卡.CPU卡.身份证等多种感应卡的刷卡功能.以及相关门禁控制器.门禁闭门器.磁力锁.电插锁.电控锁.开门按钮.门禁电源等多配件的搭配与选型,本文章主 ...

  4. 【Python】秀儿!两行代码制作你的专属动态二维码

    全文干货,建议收藏以后使用哟! 目录 普通二维码 带图片的艺术二维码 动态二维码 函数常用参数表 今天跟大家分享一个Python两行代码展现骚操作的小项目,生成自己专属的精美二维码,包括普通二维码.带 ...

  5. C语言基础入门48篇_30_二维数组的定义与使用(二维数组的定义:type 数组名[行][列]、二维数组的初始化、二维数组的引用)

    1. 二维数组的定义 type 数组名[行][列] 2. 二维数组的初始化 2.1 全部初始化为0 char chAry[2][3] = { 0 }; 实例: #include <stdio.h ...

  6. pycharm定义空的二维数组_Excel VAB入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  7. c语言二维数组对角线输出字符,输出二维数组对角线上的数 c语言 二维数组 对角线相加...

    1.编写程序,把下面的数据输入到一个二维数组中: 25 36 78 13 12 26 8我自己编的,用VISUAL C++6.0 测试过了 #include"stdio.h" vo ...

  8. C语言求二维数组平均数,一道JavaScript的二维数组求平均数的题

    JavaScript中只支持一维数组,但是可以在数组中嵌套数组来创建二维以至于多维的数组.今天下午在看书时候,发现一道感觉比较有意思的题,就是js中如何求二维数组的列之和和行之和,现在就给大家分享下, ...

  9. C语言中如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

最新文章

  1. 学会这两样高级用户,让你成为 Git老手
  2. C++重载下标操作符[](二)
  3. kafka 不同分区文件存储_Kafka文件存储机制思考及答案:为什么要分区呢?分区存了哪些内容?...
  4. jsp 嵌入java_关于JSP里的Java语句嵌入问题
  5. python-函数的多值传参
  6. 多年以前提高asp.net分页查询效率的一个实例
  7. minheight能继承吗_遗嘱中的房屋被拆迁,指定继承人能继承对应的拆迁款或安置房吗?...
  8. 微信小程序如何引用阿里icon字体
  9. 公募基金资格:社保、养老金、企业年金,三者有什么区别?
  10. 武汉理工计算机研究生就业去向统计,武汉理工大学《2019届毕业生就业质量报告》发布,本科生月薪7333...
  11. 归档日志路径三个参数DB_RECOVERY_FILE_DEST和LOG_ARCHIVE_DEST和LOG_ARCHIVE_DEST_n
  12. Java单元测试之JUnit 5快速上手
  13. The Hacker Way
  14. 小书匠配置github图床服务(详细版)
  15. oracle 11g duplicate database基于备份复制数据库(四)
  16. powerdns 系列之二 PowerDNS Authoritative Server
  17. 如何开发一个 WPS 加载项
  18. Linux网卡限速下载,端口限速下载脚本,网卡流量监控脚本
  19. 集成Opencascade+Gmsh+OSG的CAD测试程序
  20. 大学计算机未来五年规划,大学生活评价与未来五年计划(8页)-原创力文档

热门文章

  1. 基于深度学习的海洋动物检测系统(Python+YOLOv5+清新界面)
  2. 清洗的皮鞋面为什么会出现龟纹呢?
  3. nw.js linux install,使用NW.js搭建简单的webapp
  4. Linux非常好的一些技巧
  5. 向混合云迁移成为趋势,但信息管理要跟上
  6. ecstore 手机端 收货地址 ajax效果异常的排查
  7. CSS实现磨砂玻璃(毛玻璃)效果样式
  8. mysql 类似于check_【小白福利—初级DBA入门必看】MySQL常用工具介绍(六)——客户端工具MySQL_check...
  9. IOS直播不能播放的问题解决,H5直播
  10. python colorama_让Python的print变得更好看——prettytable和colorama