malloc函数及用法

发布者:陈风102最新更新时间:2019-11-18 来源: 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语言调用汇编语言编程

推荐阅读最新更新时间:2024-11-07 14:00

C51之局部变量和全局变量小记
若在C51中定义一个全局变量,编译器将在RAM中为该变量指定一个专用地址,在C程序中给变量赋的值将存入这个专用地址中,程序操作该变量是,首先从专用地址中取出存放的值,然后再进行计算。全局变量被定义在内存中的专门地址上,存储位置固定。对于频繁存取的重要变量但可以采用全局变量以减少代码的长度;由于全局变量总是占用内存,如果过多,或者把程序处理和计算中的一些中间变量也定义为全局变量,将大大消耗内存空间,处理速度会变慢,同时数据安全性也会降低。 C51中定义一个的局部变量可以和全局变量同名,但在这种情况下,局部变量的优先级较高,而同名的全局变量在该功能模块内暂时被屏蔽。 若在C51中定义一个局部变量,编译器会将该变量的地址分配到寄
[单片机]
【STM32F0】Keil 查看局部变量显示
现象: 在进行STM32F0开发的时候出现了,调试代码,添加变量Watch时,显示not in scope。 处理方式: 因为代码开了优化的处理,把优化改到Level0,就可以解决问题。
[单片机]
结构指针变量作为函数参数传递
结构变量可以作为函数参数进行整体传递。传送过程:全部成员逐个传递。指针变量作函数参数进行传递。则实参传向形参的只是地址,从而减少了时间和空间的开销。 用结构指针变量作函数参数编程。 #include stdio.h #define STU struct stu void ave(struct stu *ps); STU //stu结构名 { int num; char *name; char sex; float score; }boy ={ {101, Zhou ping ,'M',45}, {102, Zhang ping ,'M',62.5}, {103, Liou fang
[单片机]
【STM32】Keil中Debug模式下全局变量的实时查看
在使用Keil开发环境编写stm32程序时我们经常会用到硬件在线仿真的功能,能在watch窗口中看到我们在程序中定义的全局变量。我们希望在程序实时运行中看到变量的变化情况,但有时不能实时查看,原因是软件的设置不对。 在Debug模式下,点击菜单栏下的View,在下面有一个Periodic Window update 点一下,选定一下就行了。
[单片机]
labview 发布EXE中包含共享变量的相关问题解决
RT,在生成中报出如下错误。 解决办法:
[测试测量]
在中断程序里修改全局变量的童鞋注意啦-C中的volatile作用
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子: 1). 并行设备的硬件寄存器(如:状态寄存器) 2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables) 3). 多线程应用中被几个任务共享的变量 回答不出这个问题的人是不会被雇佣的。我认为这是区分C程序员和嵌入式系统程序员的最基本的问题。嵌入式系统程序员经常同硬件、中断、RTOS等等打交道,所用这些都要求vo
[单片机]
AI时代,医生会被人工智能算法取代吗?
我们正在经历新技术快速扩张的时代,它在融合信息世界和实体生物世界。AI、电子健康记录和大数据、远程医疗、家用监控的“可穿戴设备”和虚拟/增强现实这些新科技正在塑造着未来,让医疗保健服务变得更有效、更准确、且更具可持续性。来自DeepMind和IBM  Watson等行业领导者已经在英美的医疗保健领域进行AI测试。机器在很多方面都具有优势,让一些临床医生担心AI会取代医生的角色,但这种想法低估了医生对于病人和社会的作用和价值。AI的确可能给医疗行业带来巨变,但让一名医生成为好医生的核心价值观是不会改变的。   在人工智能时代,医生将需要放弃旧角色,并找到最适合他们的地方,发挥最重要的影响。AI的中心是它的算法,大家关注的是新算法在哪
[医疗电子]
keil c51 Compiler变量类型的问题,以及c的部分优化
最近和一位8051都老前辈接触51单片机(接触arm之后返璞归真??不过,51是个好东西),我用keil C写了一个test,他用汇编(他的汇编功力的是恐怖),我c生成的hex,经过反汇编之后对比两个程序,发现c生产的hex冗余码不是一般的多。特别是8位以上的乘除法,keil的C compiler直接套用一个固定的汇编子函数,通用,但冗长,效率很低。需要理解内部结构才能写出高效简洁的好程序,现在觉得《10天学会单片机》害人不浅啊。 我得到点点关于c优化提示: 1.数据类型使用一定要准确,要配合muc的特性。 从数据存储类型来说,8051系列有片内、片外程序存储器,分别对应code、data、xdata、idata以及根
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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