C语言中的free函数
一、动态存储分配
在数组一章中,曾介绍过数组的长度是预先定义好的,在整个程序中固定不变。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。
二、释放内存空间函数free
调用形式:
free(void*ptr);
功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。
【例1】分配一块区域,输入一个学生数据。
main()
{
struct stu
{
int num;
char *name;
char sex;
float score;
} *ps;
ps=(struct stu*)malloc(sizeof(struct stu));
ps->num=102;
ps->name="Zhang ping";
ps->sex='M';
ps->score=62.5;
printf("Number=%d Name=%s ",ps->num,ps->name);
printf("sex=%c Score=%f ",ps->sex,ps->score);
free(ps);
}
本例中,定义了结构stu,定义了stu类型指针变量ps。然后分配一块stu大内存区,并把首地址赋予ps,使ps指向该区域。再以ps为指向结构的指针变量对各成员赋值,并用printf输出各成员值。最后用free函数释放ps指向的内存空间。整个程序包含了申请内存空间、使用内存空间、释放内存空间三个步骤,实现存储空间的动态分配。
free()只能释放堆内存,也就是malloc()创建的
前段时间,看某人代码的时候看到
free(q);
q->lru = *blk_head_lru.next;
这样一句,感觉有点奇怪,为啥一个指针free后,还能赋值,而结果也正确。
后百思不得其解。
后Google之,发现free后只是做了个标记,告诉系统这块内存不用了,一旦调用后, 那个地址是不被保护的, 也就是说其他的变量随时可能占用那个地址。
后想到如果free后,再malloc一个新变量那么那个值是否被覆盖了?
写了一代码试了试
#include <stdio.h>
#include <malloc.h>
int main()
{
int *a = (int *)malloc(sizeof(int));
*a = 5;
free(a);
printf("a = %d\n",*a);
*a = 4;
printf("a = %d\n",*a);
int *b;
b = (int *)malloc(sizeof(int));
printf("a = %d\n",*a);
return 0;
}
VS2005编译通过。
如果有free
结果是
a = -572662307
a = 4
a = -842150451
如果注释掉free
a = 5
a = 4
a = 4
这是为什么呢?
C语言中的free函数相关推荐
- c语言中的printf函数_C语言中的printf()函数与示例
c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...
- c语言的point函数,C语言中friend友元函数详细解析
C语言中friend友元函数详细解析 友元函数是可以直接访问类的私有成员的非成员函数.它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需在友元的名称前加上关键字frien ...
- C语言中的strstr函数
C语言中的strstr函数 说到strstr函数,可能很多人会比较陌生,对比其他的字符串函数比如strcpy,strcmp等等,它的确比较少用,但其实他也是一个非常有用和常见的函数,今天,就让我们一起 ...
- C语言中的atoi函数的实现
C语言中有很多的库函数,其实平时没事的时候多去实现一下里面的库函数还是很有用的,下面就来讲一讲C语言中的atoi函数,这个函数的主要功能是将一个字符串转化为一个数字,可能第一眼看上去,你会觉得这是一个 ...
- main c语言中变量的定义,C语言中在main函数中定义的变量是全局变量么_后端开发...
PHP 和 JavaSript 区别_后端开发 PHP是一种创建动态交互性站点的强有力的服务器端脚本语言,主要用于Web开发领域,而JavaSript是一种具有函数优先的轻量级,解释型或即时编译型的高 ...
- C语言中的sprint函数,求sprintf函数的详解
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:求sprintf函数的详解,要附带例,粘贴来的也可以,只 问题详情:还有就是我还想要一些常用的宽度修饰之类的输入或者输出格式:回答: ...
- c语言里面gets(a)是什么意思,C语言中的gets()函数
在c语言中读取字符串有多种方法,比如scanf() 配合%s使用,但是这种方法只能获取一个单词,即遇到空格等空字符就会返回.如果要读取一行字符串, 比如:I love MIT 这种情况,scanf() ...
- C语言中的Sleep函数的解读
Sleep函数: 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned seconds); 注意: 在VC中使用带上头文件#include <windows.h& ...
- sleep函数的作用c语言,C语言中的sleep函数是什么意思【详细介绍】
计算机知识:C语言中的Slee函数 Sleep函数简介: 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在V ...
- c语言使用free释放指针报错,C语言中的free函数用法执行机制分析
free函数是C语言或者C++程序语言的常用函数,那么free函数有什么用途呢?free函数又怎么用呢?C语言中的free函数用法执行机制分析,一起来看看free内部的机制以及和delete的对比分析 ...
最新文章
- TensorFlow文本情感分析实现
- xp系统本地连接服务器,本地连接,xp系统本地连接不见了怎么办
- Zabbix poller processes more than 75% busy
- 面向对象笔记2 原型链 解释
- TensorFlow维度变换函数语句
- mysql数据库备份(完全备份,增量备份)
- java陷阱常见面试题_Java常见陷阱
- maven 父maven_Maven不会吮吸。 。 。 但是Maven文件会
- View,SurfaceView,SurfaceHolder
- 浅谈java的静态代理模式
- python sftp连接_Python 脚本:创建SFTP连接传输数据
- C++中“强制转换”的四大天王
- 国内外优秀音视频博客
- 电脑的记事本如何显示行数
- png格式图像转成jpg图像时出现异常颜色值
- 嵌入式开发如何入门?
- 为win7系统盘减肥
- 未援与用户在此计算机,在里番世界里拯救世界
- python输出两个元素空格隔开_python实现将一串字符每两个一组,中间用空格隔开...
- 【问题思考总结】为什么跳跃间断点变上限积分连续但是不可导?【直观理解 几何方法】
热门文章
- ibm x60 学习linux,IBM X60 T60系列安装系统时SATA设置问题
- robotium测试
- codesmith mysql 注释_完美解决CodeSmith无法获取MySQL表及列Description说明注释的方案...
- JMX详解及JConsole使用
- SSH框架搭建和整合(struts2、spring4、hibernate5)
- 编写VTK文件,导入paraview显示
- 1.使用百度AI识图api,进行识图
- 调用百度识图api实现识图vue+springboot
- python 邮件分类_python_NLP实战之中文垃圾邮件分类
- debian关闭图形界面_禁止debian自动启动图形界面