用C编写一个my2DAlloc函数
来源:互联网 发布:淘宝优优管家是真的吗 编辑:程序博客网 时间:2024/06/03 16:18
用C编写一个my2DAlloc函数,可分配二维数组。将malloc函数的调用次数降到最少,并确保可通过arr[i][j]访问该内存。
解法:
大家都知道,二维数组本质上就是数组的数组。既然可以用指针访问数组,就可以用双重指针来创建二维数组。
基本思路是先创建一个一维指针数组。然后,为每个数组索引,再新建一个一维数组。这样就能得到一个二维数组,可通过数组索引访问。
① 链式
下面是该做法的实现代码。
仔细观察上面的代码,注意我们是怎样让rowptr根据索引指向具体位置的。下图显示了内存是怎么分配的。
释放这些内存不能直接对rowptr调用free。我们要确保不仅释放第一次malloc调用分配的内存,还有释放后续每次malloc调用分配的内存。
②连续
我们还可以分配一大块连续的内存,这样就不必分配很多个内存块(每一行一块,外加一块内存,存放每一行的首地址)。举个例子,对于五行六列的二维数组,这种做法的效果如下图所示。
看到这样的二维数组似乎有点奇怪,注意,它与前一张图并没有什么不同。唯一区别是现在是一大块连续的内存,因此,此例中前五个要素指向同一块内存的其它位置。
下面是这种做法的具体实现。
注意,仔细观察第11~13行代码的具体实现。假设该二维数组有五行,每行六列,则array[0]会指向arra[5],array[1]指向array[11],依次类推。
随后,当我们真正调用array[1][3]时,计算机会查找array[1],这是个指针,指向内存的另一个地方,其实就是指向array[5]的指针。这个元素会被视为一个数组,然后取出它的第3个元素(索引从0开始)。
用这种方法构建数组只需要调用一次malloc,另外还有个好处,就是清除数组时也只需调用一次free,而不必专门写个函数释放其余的内存块。
- 用c编写一个my2DAlloc函数。
- 用C编写一个my2DAlloc函数
- 【C++】用C编写一个my2DAlloc函数,可以分配二维数组。
- 程序员面试金典: 9.13 C和C++ 13.10用C编写一个my2DAlloc函数,可分配二维数组。将malloc函数的调用次数降到最少,并确保 可通过arr[i][j]访问该内存。
- 写一个名为my2DAlloc的函数,用它开辟一个二维数组
- my2DAlloc
- 用c语言实现 编写一个函数reverse_string(char * string)
- C语言 编写一个函数,用递归方式求最大公约数。
- 【C语言】编写一个折半查找函数
- 用c语言实现 编写一个函数,它从一个字符串中提取一个子字符串
- 请编写一个C函数,将一个字符串逆序
- 用c语言实现 编写一个函数实现n^k,使用递归实现
- C语言 一个字符串翻转函数的编写
- 【C++】编写一个简单的函数实现重载。
- 【c语言】编写一个函数计算字符串长度
- 【C语言】编写一个函数,求字符串长度
- C 编写求一个数组中最大值的函数
- 如何编写一个没有主函数的C程序
- MPI环境支持的PSO算法
- opencv K均值算法
- 【算法题】重建二叉树
- mysql5.7编译安装
- 机器学习与数据挖掘相关算法汇总
- 用C编写一个my2DAlloc函数
- 计提与摊销的区别
- JAVA面试要点006---.net中的委托与java中的代理模式和委托
- 【JavaScript】第一篇
- c++三大概念要分清--重载,隐藏(重定义),覆盖(重写)
- Linux学习总结(二)
- ARGB与RGB、RGBA的区别
- 《算法分析与设计》Week 18
- 500. Keyboard Row