当前位置: 首页 > 编程日记 > 正文

指针空间的申请与释放

一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。

char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr) { exit (1); } gets(Ptr);
void free(void *FirstByte): 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。
free(Ptr); Ptr = NULL; // code...

free()到底释放了什么?这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点! 就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。
3、关于函数使用需要注意的一些地方:
A、申请了内存空间后,必须检查是否分配成功。
B、当不需要再使用申请的内存时,记得释放;释放后应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。
C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会
出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。
D、虽然malloc()函数的类型是(void *),任何类型的指针都可以转换成(void *),但是最好还是在前面进行强制类型转换,因为这样可以躲过一
些编译器的检查。
好了!最基础的东西大概这么说!现在进入第二部分:

二、malloc()到底从哪里得来了内存空间:
1、malloc()到底从哪里得到了内存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!
说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:
2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。
什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ESP寄存器。栈空间不需要在高级语言里面显式的分配和释放。
以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了^_^.
通过上面对概念的描述,可以知道:
栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。
堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!

一、定义指针的时候一定要初始化。

变量定义的时候给变量初始化,这是保证不出错的一个很好的习惯。尤其是在指针的使用上,如果我们没有给指针初始化,就会出现野指针,该指针的指向并不是我们所希望的,一旦错误的释放了这个指针,就会发生内存的访问。那么如何初始化指针变量呢,一般有以下几种方法:
1、初始化空指针
int* pInteger=NULL;
2、用已有的变量初始化
int length=5;
int* pInteger=&length;
3、用内存分配函数给指针分配空间
int* pInteger=(int*)malloc(10*sizeof(int));//为指针分配大小为10个整数的内存空间。
二、正确的申请和释放内存
指针使用之后,如果不释放指针所使用的内存,就会造成内存的泄露,这样就会有大量内存由于没能释放,别的程序不可以使用这部分内存,如果一个程序不停申请内存而不去释放内存,很快就会造成系统的崩溃。那么如何正确的申请和释放内存呢。
1、指针初始化,上面已讲
2、正确的申请内存
如何申请内存才算是正确的申请内存呢?首先要判断指针是否为空,如果不为空,则释放该指针所指向的内存块,如果不释放这块内存,而直接就申请内存,就会造成内存的泄露。申请内存后,一定要判断是否申请成功。
如:int* pInteger=NULL;//指针定义处
...
if(pInteger != NULL)
{
free(pInteger);
pInteger=NULL;//指针释放之后并不为空,要设置其为空
}
pInteger=(int*)malloc(10*sizeof(int));
if(pInteger != NULL)
{
printf("内存申请没有成功/n!");
exit(0);
}
...
3、内存释放
程序使用完了指针,一定要记得释放指针指向的内存。释放后一定要记得设置指针为空指针。因为free函数在释放指针后,只是单纯的释放了该指针指向的内存空间,而没有将指针赋为空值。所以一定要记得在释放指针后将指针赋为空值。
如:
int* pInteger=NULL;//指针定义处
...
free(pInteger);//释放指针
pInteger=NULL; //指针赋为空值
三、使用指针时一定要判断指针是否为空
在使用指针时一定要判断指针是否为空,如果为空,则做相应的操作。如果不做判断,则可能错误的使用空指针。
如:char* dest=NULL;
...
strcpy(dest,"string");//如果dest为空则出错
正确的使用方法为:
if(dest == NULL)
{
dest=(char*)malloc(7*sizeof(char));//因为字符串以“/0”结束,
//所以要申请7个字符的内存
//判断内存申请是否成功
...
}
strcpy(dest,"string");
在指针的使用过程中,基本上要注意的问题就是这些

转载于:https://www.cnblogs.com/I-L-o-v-e-z-h-o-u/p/4950528.html

相关文章:

UIGraphicsBeginImageContext - 位图上下文

UIGraphicsBeginImageContext 首先,先来认识一个UIGraphicsBeginImageContext,它会创建一个基于位图的上下文(context)(默认创建一个透明的位图上下文),并将其设置为当前上下文。 位图图形上下文UIKit是不会负责创建的&#xff0c…

小程序双击事件

代码&#xff1a; <button data-time"{{lastTapTime}}" data-title"标题" bindtap"doubleClick">双击</button> js data: {lastTapTime:0,}, doubleClick: function (e) {var curTime e.timeStampvar lastTime e.currentTarget…

快速了解Kubernetes微服务中的通信

by Adam Henson亚当汉森(Adam Henson) 快速了解Kubernetes微服务中的通信 (A quick look at communication in Kubernetes microservices) “服务”概念和一个Node.js示例 (The “service” concept and a Node.js example) Based on complexity, a layer of microservices ca…

连接 linux服务器

操作步骤&#xff1a; xshell 下载 https://xshell.en.softonic.com/ 点击下载后&#xff0c;会有邮箱验证&#xff0c;点击验证通过就会自动下载&#xff0c;然后安装就行。 打开工具&#xff0c;点击新建会话 然后 浏览文件后直接点击确认&#xff0c;出来这样就登录成功了…

【bzoj3924】[Zjoi2015]幻想乡战略游戏 动态点分治

题目描述 傲娇少女幽香正在玩一个非常有趣的战略类游戏&#xff0c;本来这个游戏的地图其实还不算太大&#xff0c;幽香还能管得过来&#xff0c;但是不知道为什么现在的网游厂商把游戏的地图越做越大&#xff0c;以至于幽香一眼根本看不过来&#xff0c;更别说和别人打仗了。 …

面试题05-UI控件

怎么解决缓存池满的问题(cell)ios中不存在缓存池满的情况&#xff0c;因为通常我们ios中开发&#xff0c;对象都是在需要的时候才会创建&#xff0c;有种常用的说话叫做懒加载&#xff0c;还有在UITableView中一般只会创建刚开始出现在屏幕中的cell&#xff0c;之后都是从缓存池…

全球链界科技发展大会_如何成为科技界的团队合作者

全球链界科技发展大会by Ofer Vugman由Ofer Vugman 如何成为科技界的团队合作者 (How to be a team player in the tech world) 这些技巧将增进您的关系并提高团队的工作效率 (These tips will boost your relationships and your team’s efficiency at work) When I landed …

linux驱动之i2c子系统mpu6050设备驱动

以下是mpu6050简单的驱动实现&#xff0c;mpu6050是I2C接口的6轴传感器&#xff0c;可以作为字符设备注册到内核&#xff0c;本代码运行环境是3.4.2内核&#xff0c;4.3.2版本的编译链&#xff0c;12.04版本的Ubuntu&#xff0c;硬件环境是jz2440开发板&#xff1b; 按照之前分…

小程序使用富文本完整代码及示例图

先看示例图&#xff1a; 富文本html代码&#xff1a; 效果图&#xff1a; 实现步骤&#xff1a; 1.下载 wxParse代码放到你的小程序项目目录里面 https://github.com/icindy/wxParse 基本使用方法 Copy文件夹wxParse - wxParse/-wxParse.js(必须存在)-html2json.js(必须存在…

C# 百分比的获取

这里介绍 C# 百分比转换有2种方式 例&#xff1a; double a50; double b100; a/b.ToString("0.00%"); 或 a/b.ToString("P3"); p后的数字表示能显示小数点后几位的精度数 实际如&#xff1a; 方法一&#xff1a;a/b.ToString("0.00%"); 方法二&a…

css 网格布局_我从CSS网格布局中学到的东西

css 网格布局by Jennifer Wjertzoch珍妮弗维佐奇 我从CSS网格布局中学到的东西 (Things I’ve learned about CSS grid layout) With CSS Grid you can create complex web designs. It is very intuitive and very well supported by the major browsers. In this article I …

GoF23种设计模式之行为型模式之解释器模式

一、概述 给定一种语言和其文法的一种表示&#xff0c;再定义一个解释器&#xff0c;该解释器使用表示来解释语言中的句子。 二、适用性 当需要解释一种语言&#xff0c;并且可以将该语言中的句子表示为一个抽象语法树的时候。 1.该文法简单对于复杂的文法&…

U盘安装Ubuntu14.4时遇到分区问题记录

1、在安装Ubuntu14.4时&#xff0c;遇到如果先分出 / 跟挂载的主分区时&#xff0c;后面只能再分一个swap&#xff0c;或者挂载一个/home&#xff0c;或者一个/ boot 时不能继续分区&#xff0c;当然想安装也是不能不能成功的。 解决办法&#xff1a;在这里先不要创建 / 的主挂…

请求异步js,请求完成后执行代码

要确定请求完成 js 文件&#xff0c;才执行相关的代码。 场景&#xff0c;引用了百度地图的 js-sdk&#xff0c; 需要实例化 SDK 对象&#xff0c;但是这个引用加载JS-SDK文件其实是异步的&#xff0c;在没请求完成之前就实例化对象就会报错&#xff0c;提示找不到该对象。 解…

测试驱动开发 测试前移_测试驱动开发简介

测试驱动开发 测试前移I’ve been programming for five years and, honestly, I have avoided test-driven development. I haven’t avoided it because I didn’t think it was important. In fact, it seemed very important–but rather because I was too comfortable no…

BZOJ 2957楼房重建

传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #include<vector> #define lc x<<1 #define rc x<<1|…

AngularJs $cacheFactory 缓存服务

可能之前的api写的有些枯燥吧&#xff0c;因为不烧脑&#xff0c;不需要很多逻辑思维来做处理&#xff0c;那么之后的文章会有趣很多&#xff0c;慢慢的开始烧脑了&#xff0c;准备好大量脑细胞的死亡吧~ 先来篇简单的缓存服务。 本文将api文档里的$cacheFactory和 $cacheFac…

H5使用百度地图SDK获取用户当前位置并且标记显示在地图

代码实现功能&#xff1a; H5使用百度地图SDK获取用户当前位置并且标记显示在地图&#xff0c;点击该标记弹出一层自定义的HTML。 效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" conten…

clojurescript_为什么ClojureScript在NPM上如此出色

clojurescriptby Jacek Schae由Jacek Schae 为什么ClojureScript在NPM上如此出色 (Why ClojureScript works so well with NPM) Every language that complies/transpiles to JavaScript wants to connect to npm to use this huge ecosystem. The master of this is, of cour…

微信网页开发 jssdk前后端代码,PHP实现完整代码,自定义分享

如果你页面启用了https&#xff0c;务必引入 https&#x1f615;/res.wx.qq.com/open/js/jweixin-1.0.0.js &#xff0c;否则将无法在iOS9.0以上系统中成功使用JSSDK 微信网页JS-SDK的功能实现&#xff0c;后端php&#xff0c;完整源码。分享内容自定义。 jsapi_ticket &…

delphi自定义事件处理

http://www.cnblogs.com/ywangzi/archive/2012/09/06/2673414.html delphi自定义事件处理 为什么我们点击按钮&#xff0c;就会执行按钮的onclick事件&#xff1f;这个事件是怎么和我们自己的代码关联起来的。相信很多人都有这个疑问。那么我们就通过一个自定义事件来了解这里面…

textarea输入框限制字数(JS)

第一种: <textarea οnkeyup"checkLen(this)"></textarea> <div>您还可以输入 <span id"count">200</span> 个文字</div> <script type"text/javascript"> function checkLen(obj) { var maxCha…

域名管理系统 二级域名_域名系统简介

域名管理系统 二级域名by Sumedh Nimkarde由Sumedh Nimkarde 域名系统简介 (An introduction to the Domain Name System) You all might have heard about or know about the Domain Name System (DNS) if you understand how the internet works or how computer networks w…

redis面试总结

&#xff08;1&#xff09;什么是redis? Redis 是一个基于内存的高性能key-value数据库。 &#xff08;2&#xff09;Reids的特点 Redis本质上是一个Key-Value类型的内存数据库&#xff0c;很像memcached&#xff0c;整个数据库统统加载在内存当中进行操作&#xff0c;定期通…

struts2 实现自定义标签

/*** lostingz* Created on 2015年11月18日*/ package com.test.web.tags;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.apache.struts2.components.Component; import org.apache.struts2.views.jsp.ComponentTa…

php修改多个字段

1.直接修改 2.按条件修改 1.代码&#xff1a; <?phpheader("Content-Type:text/html;charsetutf8"); header("Access-Control-Allow-Origin: *"); //解决跨域header(Access-Control-Allow-Methods:GET);// 响应类型 header(Access-Control-Allow-H…

备忘录吕吕没有备忘录十新建_一份备忘单,可帮助您记住CSS自定义属性

备忘录吕吕没有备忘录十新建CSS custom properties, also known as CSS variables, represent custom properties that can be declared and be called in your CSS.CSS定制属性&#xff0c;也称为CSS变量&#xff0c;表示可以在CSS中声明和调用的定制属性。 在CSS中声明自定义…

Oracle数据库一些操作信息

Oracle数据库如何查看当前用户角色权限及默认表空间查看当前用户的一些信息&#xff0c;包括用户拥有的角色权限信息、用户表空间以及用户和默认表空间的关系等--查看用户的角色权限1、查看当前用户拥有的角色权限信息&#xff1a;select * from role_sys_privs; 2、查看所有用…

Eclipse用法和技巧十:显示代码outline

在一个文件中快速找到某一个方法或者某一个作用域&#xff0c;可以使用 CtrlO或者CtrlF3&#xff0c;快速显示当前代码的outline&#xff0c;进行快速查找。效果如下&#xff1a; 这里主要是补充一些后续操作&#xff0c;能更加方便的帮助我们查找。 步骤一&#xff1a;再…

上传文件到服务器指定目录,文件名相同自动替换PHP实现代码

效果图&#xff1a; html代码&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body><form action"https://xxx.wang/xxx/upload.php&qu…