一起学习C语言:初谈指针(三)
上一篇<一起学习C语言:初谈指针(二)> 中,我们了解了进程中的内存区域,以及动态管理内存空间方式。本篇文章中,我们分析更多的动态分配函数,并通过示例来了解不同场景中的动态内存的分配、使用和释放方式。
章节预览:
7. 常见的动态分配函数
8. 本章总结
目录预览
章节内容:
7. 常见的动态分配函数
在一些场景中,由于malloc函数分配方式较为局限性,而不能满足使用要求。接下来,我们了解更多关于内存分配的函数。
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);
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.
_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.
_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语言:初谈指针(三)相关推荐
- 一起学习C语言:初谈指针(二)
上一篇<一起学习C语言:初谈指针(一)> 中,我们了解了指针变量的声明和初始化方式,以及指针变量的引用赋值方式.本篇文章中,我们初步分析不同的内存空间 ,并通过示例来了解动态内存的分配.使 ...
- 一起学习C语言:初谈指针(一)
上一章<一起学习C语言:数组> 中,我们了解了数组的用法和适用场景,以及不同维度数组的下标计算方式.本章节,我们初步了解指针,并通过示例分析指针.指针变量的性质. 章节预览: 初谈指针 1 ...
- c语言中指针的类型,学习C语言中的指针类型
摘要:结合我院学生十年来参加全国计算机等级考试(C语言部分)情况,通过分析成绩分布与题型关系,我们发现指针方面的题型失分率最高.在此基础上结合教学实际,本文提出学习指针知识的方法和顺序过程,并将其应用 ...
- 我的Go+语言初体验——【三、spx案例测试(附-视频)】
欢迎大家参与[我的Go+语言初体验]活动: 活动地址:[https://bbs.csdn.net/topics/603464006?utm_source=1594742339] 安装过程博文:[我的G ...
- 我的Go+语言初体验——【三、spx案例测试_许式伟先生推荐补充(附-视频)】
欢迎大家参与[我的Go+语言初体验]活动: 活动地址:[https://bbs.csdn.net/topics/603464006?utm_source=1594742339] 安装过程博文:[我的G ...
- C语言初阶第三篇:换我心,为你心,始知C语言 从C语言选择语句到循环语句保姆教学来喽
换我心,为你心,始知C语言 老铁们,咱们上一篇文章把字符串的知识点给过了一遍,今天就要开始真正的程序语句的学习了,也就是选择语句和循环语句,今天的内容比较简单,所以写的也不多,废话不多说,咱们开始吧! ...
- 学习go语言的一些笔记(三)
1 指针 package mainimport "fmt"func main() {// 指针问题// 1 指针:是存储另一个变量的内存地址的变量var num int = 199 ...
- 从零开始学C语言 : 初阶指针
目录: 1. 指针是什么 2. 指针和指针类型 3. 野指针 4. 指针运算 5. 指针和数组 6. 二级指针 7. 指针数组 1.指针是什么: 1. 指针是内存中一个最小单元的编号,也就 ...
- 一起学习C语言:函数(三)
上一篇<一起学习C语言:函数(二)> 中,我们了解了内部函数和外部函数,以及变量的声明周期与作用域.本章节,我们分析函数的存储类别与声明方式,以及函数的递归调用原理. 章节预览: 6. 变 ...
最新文章
- 万年历小程序(黑框)
- 智能视觉组赛博 -10赛后反馈
- nodemcu是怎么一步一步的开发出来的
- HBase 3.0 可能的新特性
- python学习笔记(二)列表(List)操作方法详解
- arrylist和linked list区别
- 如何将原图和json融合_用 base64 进行图片和字符串互转,并保存至 json
- 17.Linux/Unix 系统编程手册(上) -- 访问控制列表
- King Arthur
- pandas 日期比较大小_如何计算不同pandas列中两个日期之间的年数
- unity 2020可用NDK 下载地址版本为19.0.5232133
- 控制策略 | PI控制器积分分离的仿真分析
- VXLAN技术产生背景
- 快速破解基于linux内核的开源路由器后台管理登录密码
- BAT 条件判断 IF
- T270731 中奖
- 应用与计算机病毒,计算机病毒论文
- 【网络流量识别】【深度学习】【三】CNN和LSTM—基于信息获取和深度学习的网络流量异常检测
- python-画3D图
- SAP_HCM_Schema_CN28_XIN0
热门文章
- IntelliJ IDEA母公司JetBrains遭美国调查,其是美国被大规模黑客攻击的源头?
- Java 面试 80% 的人都会踩这些坑,你知道几种?
- 90后美女大学生,年薪30W的程序员,他们都决定去送外卖了!
- Vue、element-ui的resetFields()方法重置表单无效问题及解决办法
- Spring Cloud 入门 之 Config 篇(六)
- Grunt 新手指南
- 根据hibernate拦截器实现可配置日志的记录
- JavaScript 解析 JSON 数据
- MySQL学习笔记_3_MySQL创建数据表(中)
- jsondataobjects