历史上的今天

今天是:2024年11月18日(星期一)

2019年11月18日 | malloc函数及用法

发布者:陈风102 来源: 51hei关键字:malloc函数  变量  动态存储分配 手机看文章 扫描二维码
随时随地手机看文章

动态存储分配
在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。C语言中不允许动态数组类型。


例如:
int n;
scanf("%d",&n);
int a[n];
用变量表示长度,想对数组的大小作动态说明,这是错误的。但是在实际的编程中,往往会发生这种情况,即所需的内存空间取决于实际输入的数据,而无法预先确定。对于这种问题,用数组的办法很难解决。为了解决上述问题,C语言提供了一些内存管理函数,这些内存管理函数可以按需要动态地分配内存空间,也可把不再使用的空间回收待用,为有效地利用内存资源提供了手段。


常用的内存管理函数有以下三个:


1. 分配内存空间函数malloc
调用形式:
(类型说明符*)malloc(size)
功能:在内存的动态存储区中分配一块长度为"size"字节的连续区域。函数的返回值为该区域的首地址。
“类型说明符”表示把该区域用于何种数据类型。
(类型说明符*)表示把返回值强制转换为该类型指针。
“size”是一个无符号数。
例如:
pc=(char *)malloc(100);
表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。


2. 分配内存空间函数 calloc
calloc 也用于分配内存空间。
调用形式:
(类型说明符*)calloc(n,size)
功能:在内存动态存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。
(类型说明符*)用于强制类型转换。
calloc函数与malloc 函数的区别仅在于一次可以分配n块区域。
例如:
ps=(struet stu*)calloc(2,sizeof(struct stu));
其中的sizeof(struct stu)是求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。


2. 释放内存空间函数free
调用形式:
free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
【例】分配一块区域,输入一个学生数据。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->;
ps->sex='M';
ps->score=62.5;
printf("Number=%dnName=%sn",ps->num,ps->name);
printf("Sex=%cnScore=%fn",ps->sex,ps->score);
free(ps);
}

本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。

关键字:malloc函数  变量  动态存储分配 引用地址:malloc函数及用法

上一篇:2440裸机编程之一 C语言调用汇编语言编程
下一篇:2440裸机编程之二 C语言调用汇编语言编程

推荐阅读

下一代机器学习技术为BlackBerry技术组合提供全面补充集成后BlackBerry解决方案将成为业界首款可实现智能保护固定和移动终端的产品嵌入式人工智能技术将加速BlackBerry Spark 企业物联网平台的发展 BlackBerry今日宣布已签订最终协议,将斥资14亿美元现金以及承担未兑现的员工激励,全面收购人工智能和网络安全领军企业Cylance。该交易还需获得监管部门批...
威盛电子(VIA Technologies,Inc.)今天宣布,台塑Sumco Technology(FST)已采用威盛的AI技术来改善工艺管理和高质量硅晶片的生产。通过集成先进的图像识别和智能学习算法,FST有信心在不久的将来大幅增强缺陷检测以及新工艺的生产线集成。威盛与FST之间的合作条款包括特别注意改进和升级现有基础架构,同时将对设备布局和人员操作程序的干扰降到最低...
  工业机器人是一种能模拟人的手、臂的部分动作,按照预定的程序、轨迹及其他要求,实现抓取、搬运工件或操纵的自动化装置,是很有发展前途的机电一体化典型产品,将在实现智能化、多功能化、柔性自动化生产、提高产品质量、代替人在恶劣环境条件下工作中发挥重大作用。   工业机器人的组成   机械系统   机械系统是完成抓取工件或工具实现所...
富有远见卓识的全球汽车行业嵌入式和互联软件产品供应商 Elektrobit (EB) 今天宣布推出业界首款能够实现安全、高性能车载网络通信的汽车以太网交换机固件。EB zoneo SwitchCore 现可用于行业领先硬件供应商的交换机,并已在量产电动汽车 (EV) 中得以应用。凭借此款固件,汽车制造商及其供应商能够更容易地开发下一代汽车所需的先进高带宽通信系统。EB ...

史海拾趣

问答坊 | AI 解惑

51单片机 Keil C 延时程序的简单研究(转)

应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题 ...…

查看全部问答∨

面试时的难题和对策(英文版)

面试时的难题和对策(英文版) 加拿大职业论坛      通用类问题     1. Tell me about you!     Keep your answer to one or two minutes; don\'t ramble. Use your res ...…

查看全部问答∨

创建一个NIOS环境的视频教程

视频内容为如何创建一个NIOS环境的视频教程,入门级的,很不错…

查看全部问答∨

请教LED电子屏通讯原理

我是一个研究单片机的新手,最近对LED进行专研。我是在网上的原理图和C语言代码基础上学习的。但我发现网上的资料都有一个弊端,就是没有给出LED电子屏通讯方面的代码或原理图。希望那位高手慷慨的给小弟一份,便于系统的学习单片机。 小弟先谢过 ...…

查看全部问答∨

linux 内核 模块索引图

分享一下,因为不好引用,所以直接放上链接: http://www.linuxdriver.co.il/kernel_map http://cs.jhu.edu/~razvanm/fs-expedition/tux3.html…

查看全部问答∨

哪个朋友帮忙下...我很多窗口的那种程序搞法实在不会,,

附件是个大程序,,有几个子模块,,如何打开..如果哪个朋友打开了可以截个C51的窗口不??我很多窗口的那种搞法实在不会,,截个图看下…

查看全部问答∨

高分请教关于BISS0001的一些问题!!

如上图 请教一下红圈子中的所有元件及参数的意义。 包括R6\\C3 ,R8\\C5  ,R5\\C2  ,R7\\C4 ,它们在整个电路所起的具体作用是什么 BISS0001说明书我看不懂,所以别叫我再去看那个东西…

查看全部问答∨

AT89S51和AT89C51在串行通信上的区别

就是做毕业设计,微机和单片机间串行通信的技术实现. 关于这两种芯片在串口通信间的区别,最好详细点,先谢谢各位了…

查看全部问答∨

发现vxWorks task的一个大bug,欢迎讨论!

static VOID PersistentConnectionHandler_test(void) {     taskDelete(taskIdSelf()); } extern void TEST_HTTPD_LOOP() {     while (1)     {         taskDelay(1*sysCl ...…

查看全部问答∨

谁知道为什么AVR要用熔丝位和高压编程器?

这样有什么意义呢?高压编程究竟是什么原理呢?…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved