上一篇<一起学习C语言:初谈指针(二)> 中,我们了解了进程中的内存区域,以及动态管理内存空间方式。本篇文章中,我们分析更多的动态分配函数,并通过示例来了解不同场景中的动态内存的分配、使用和释放方式。

章节预览:

7. 常见的动态分配函数
8. 本章总结
目录预览

章节内容:

7. 常见的动态分配函数

在一些场景中,由于malloc函数分配方式较为局限性,而不能满足使用要求。接下来,我们了解更多关于内存分配的函数。

  1. realloc函数

    函数原型:void * realloc(void *p, unsigned int size);

    函数描述:重新为指针p分配一块长度为size的连续内存空间

    函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL

    函数使用分析:p指向一块有效的动态内存,或p是空指针

【例7.7】 定义int类型指针,为指针重新动态分配4个int类型长度。

【方式1】

int *p = (int *)malloc(sizeof(int));
               p = (int *)realloc(p,sizeof(int) * 4);

【方式2】

int *p = NULL;
               p = (int *)realloc(p,sizeof(int) * 4);

  1. calloc函数

    函数原型:void * calloc(unsigned int num, unsigned int size);

    函数描述:用来分配num个长度为size的连续内存空间

    函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL

    函数使用分析:calloc一般做动态数组使用,其中num为元素个数,size为每个元素的长度。另外,calloc函数返回一块干净的内存(内存初始化为0)。

【例7.8】 定义一个int类型动态数组,并存储整数1、2、3、4、5。

int *p = (int *)calloc(5, sizeof(int));
               int i = 0;

for (; i < 5; i++) {
                   *(p + i) = i + 1;
                   printf(“成员%d,地址:%p 值:%d.\n”, i + 1, &p[i], p[i]);
               }

示例结果

成员1,地址:00108A98 值:1.
                   成员2,地址:00108A9C 值:2.
                   成员3,地址:00108AA0 值:3.
                   成员4,地址:00108AA4 值:4.
                   成员5,地址:00108AA8 值:5.

  1. _aligned_malloc函数

    函数原型:void * _aligned_malloc(unsigned int size, unsigned int alignment);

    函数描述:用来分配一块长度为size的连续内存空间,并且内存首地址可以整除alignment

    函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL

函数使用分析:在偏硬件方面使用的内存一般需要手动指定字节数对齐,比如16字节或32字节对齐(内存首地址可以整除这个字节数,部分情况下内存空间也需要整除这个字节数),这种情况属于内存对齐拷贝。由于malloc函数不具备这种特性,一般使用_aligned_malloc函数完成内存对齐分配。

【例7.9】 分配四个int类型内存空间,并按照16字节对齐内存。

int *p = (int *)_aligned_malloc(sizeof(int) * 4, 16);
               int i = 0;

for (; p != NULL && i < 4; i++) {
                   *(p + i) = i + 1;
                   printf(“p的地址:%p, int%d的地址 %p 值:%d.\n”, p, i + 1, p + i, *(p + i));
               }

示例结果

p的地址:01368BA0, int1的地址 01368BA0 值:1.
                   p的地址:01368BA0, int2的地址 01368BA4 值:2.
                   p的地址:01368BA0, int3的地址 01368BA8 值:3.
                   p的地址:01368BA0, int4的地址 01368BAC 值:4.

  1. _aligned_free函数

    函数原型:void _aligned_free(void * memory);

    函数描述:用来释放指针memory指向的内存对齐空间,使这块内存空间可以再次被分配使用

    函数返回值:无

    函数使用分析:由_aligned_malloc函数分配的内存必须由_aligned_free函数释放

【例7.10】 分配四个int类型内存空间,并按照16字节对齐内存,然后释放内存。

int *p = (int *)_aligned_malloc(sizeof(int) * 4, 16);
               int i = 0;

for (; p != NULL && i < 4; i++) {
                   *(p + i) = i + 1;
                   printf(“p的地址:%p, int%d的地址 %p 值:%d.\n”, p, i + 1, p + i, *(p + i));
               }

if (p != NULL)
                   _aligned_free( p), p = 0;

8. 本章总结

本章节,我们简单了解了进程中的不同内存区域以及C语言指针变量在不同内存中的使用方式。通过上述示例可以了解到,指针量不是指针,指针量属于存储内存地址的变量或常量,而指针是内存地址。在日常编程中,使用指针需要考虑许多场景,比如内存对齐场景下,需要按照规定来管理、使用。

目录预览

<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>
<一起学习C语言:C语言数据类型(二)>
<一起学习C语言:C语言数据类型(三)>
<一起学习C语言:C语言基本语法(一)>
<一起学习C语言:C语言基本语法(二)>
<一起学习C语言:C语言基本语法(三)>
<一起学习C语言:C语言基本语法(四)>
<一起学习C语言:C语言基本语法(五)>
<一起学习C语言:C语言循环结构(一)>
<一起学习C语言:C语言循环结构(二)>
<一起学习C语言:C语言循环结构(三)>
<一起学习C语言:数组(一)>
<一起学习C语言:数组(二)>
<一起学习C语言:数组(三)>
<一起学习C语言:初谈指针(一)>
<一起学习C语言:初谈指针(二)>

一起学习C语言:初谈指针(三)相关推荐

  1. 一起学习C语言:初谈指针(二)

    上一篇<一起学习C语言:初谈指针(一)> 中,我们了解了指针变量的声明和初始化方式,以及指针变量的引用赋值方式.本篇文章中,我们初步分析不同的内存空间 ,并通过示例来了解动态内存的分配.使 ...

  2. 一起学习C语言:初谈指针(一)

    上一章<一起学习C语言:数组> 中,我们了解了数组的用法和适用场景,以及不同维度数组的下标计算方式.本章节,我们初步了解指针,并通过示例分析指针.指针变量的性质. 章节预览: 初谈指针 1 ...

  3. c语言中指针的类型,学习C语言中的指针类型

    摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...

  4. 我的Go+语言初体验——【三、spx案例测试(附-视频)】

    欢迎大家参与[我的Go+语言初体验]活动: 活动地址:[https://bbs.csdn.net/topics/603464006?utm_source=1594742339] 安装过程博文:[我的G ...

  5. 我的Go+语言初体验——【三、spx案例测试_许式伟先生推荐补充(附-视频)】

    欢迎大家参与[我的Go+语言初体验]活动: 活动地址:[https://bbs.csdn.net/topics/603464006?utm_source=1594742339] 安装过程博文:[我的G ...

  6. C语言初阶第三篇:换我心,为你心,始知C语言 从C语言选择语句到循环语句保姆教学来喽

    换我心,为你心,始知C语言 老铁们,咱们上一篇文章把字符串的知识点给过了一遍,今天就要开始真正的程序语句的学习了,也就是选择语句和循环语句,今天的内容比较简单,所以写的也不多,废话不多说,咱们开始吧! ...

  7. 学习go语言的一些笔记(三)

    1 指针 package mainimport "fmt"func main() {// 指针问题// 1 指针:是存储另一个变量的内存地址的变量var num int = 199 ...

  8. 从零开始学C语言 : 初阶指针

    目录: 1. 指针是什么  2. 指针和指针类型  3. 野指针  4. 指针运算  5. 指针和数组  6. 二级指针  7. 指针数组 1.指针是什么: 1. 指针是内存中一个最小单元的编号,也就 ...

  9. 一起学习C语言:函数(三)

    上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域.本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理. 章节预览: 6. 变 ...

最新文章

  1. 万年历小程序(黑框)
  2. 智能视觉组赛博 -10赛后反馈
  3. nodemcu是怎么一步一步的开发出来的
  4. HBase 3.0 可能的新特性
  5. python学习笔记(二)列表(List)操作方法详解
  6. arrylist和linked list区别
  7. 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
  8. 17.Linux/Unix 系统编程手册(上) -- 访问控制列表
  9. King Arthur
  10. pandas 日期比较大小_如何计算不同pandas列中两个日期之间的年数
  11. unity 2020可用NDK 下载地址版本为19.0.5232133
  12. 控制策略 | PI控制器积分分离的仿真分析
  13. VXLAN技术产生背景
  14. 快速破解基于linux内核的开源路由器后台管理登录密码
  15. BAT 条件判断 IF
  16. T270731 中奖
  17. 应用与计算机病毒,计算机病毒论文
  18. 【网络流量识别】【深度学习】【三】CNN和LSTM—基于信息获取和深度学习的网络流量异常检测
  19. python-画3D图
  20. SAP_HCM_Schema_CN28_XIN0

热门文章

  1. IntelliJ IDEA母公司JetBrains遭美国调查,其是美国被大规模黑客攻击的源头?
  2. Java 面试 80% 的人都会踩这些坑,你知道几种?
  3. 90后美女大学生,年薪30W的程序员,他们都决定去送外卖了!
  4. Vue、element-ui的resetFields()方法重置表单无效问题及解决办法
  5. Spring Cloud 入门 之 Config 篇(六)
  6. Grunt 新手指南
  7. 根据hibernate拦截器实现可配置日志的记录
  8. JavaScript 解析 JSON 数据
  9. MySQL学习笔记_3_MySQL创建数据表(中)
  10. jsondataobjects