对c语言中malloc和free函数的理解
最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识。
一. malloc函数和free函数的基本概念和基本的用法
对于malloc函数:
1. 包含的头文件:<mallloc.h> 或者<stdlib.h>
2. 函数的原型:void *malloc(unsigned int NumBytes);
3. 函数功能: 该函数分配了NumBytes个字节的内存空间,如果成功,则返回指向这块内存的指针(即这块存储区域的首地址)。如果分配失败,则返回一个空指针(NULL)(分配失败的原因往往有多种,例如内存空间不足)。
对于free函数:
1.包含的头文件:同malloc函数
2.函数原型 void free(void *ptr);
该函数无返回值。
3.函数功能:该函数通常与malloc在一起使用,用于释放malloc函数分配的内存空间。
函数用法示例:
#include<stdlib.h>
#include <stdio.h>
int main()
{
int *p;
int i = 2;
p = (int*)malloc(sizeof(int));
if(p)
{
printf("p的地址为%x!",p); } else
{
printf("分配失败!"); }
free(p); }
二.更具体的解释
对于malloc函数,其返回值的类型是void*,而void*在c语言中仅仅是用于存储地址,若对其进行赋值运算必须进行强制类型转换(void*可以转化成任意的指针类型)。一般使用完malloc函数后需要对其返回值进行检测,检测是否为空指针。分配成功后变量就获得相应的内存空间,至于内存空间是否是连续的是由操作系统所决定的;编译器只是向操作系统申请内存空间,具体如何分内存空间还是由操作系统来决定。
而对于free函数,它释放了由malloc函数所分配的内存空间。那么,如何理解此处的"释放"呢?实际上malloc函数就是给指针一个合法的地址,并且该地址指向一个合法的内存空间。而对指针进行free后,之前分配的内存空间就"自由了",即该内存空间又可以重新被操作系统所分配(既可能分配给本程序,也可能分配给其他程序);而free后的指针仍然存在,其值还是刚刚分配的内存空间的地址,并不是0(并不是NULL)。所以free之后,通常要手动的将指针设置为NULL。此处可见下面的一个例子:
#include<stdlib.h>
#include <stdio.h>
int main()
{
int *p;
int i = 2;
p = (int*)malloc(sizeof(int));
if(p)
{
printf("p的地址为%x!",p);
free(p);
printf("free后p的地址为%x!",p); } }
运行后,会发现两次输出的p的地址是相同的。至于free后的p所指向的值,既可能改变了,也可能没改变,因为它已经不受本程序控制,而由操作系统来决定;如果操作系统将其分给某个程序,且该程序给变了其值,那么它的值就变了。总结一下free函数,可简述为以下几点:
1.free只是释放了malloc所申请的内存,并不改变指针的值;
2.由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
3.为了避免失误,最好在free之后,将指针指向NULL。
4.malloc后必须free,否则会造成内存泄漏。
最后,对于由malloc函数分配空间的变量,它们往往存储在堆里(是*p不是p,p作为变量的地址还是存在栈里),而不是栈中,这点要注意。malloc申请的内存空间,也是从堆中申请,这样申请后的指针,就指向了堆中的某块内存。
对c语言中malloc和free函数的理解的更多相关文章
- ZH奶酪:C语言中malloc()和free()函数解析
1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败 ...
- C语言中malloc()和calloc()c函数用法
C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...
- C语言中malloc函数返回值是否需要类型强制转换问题
1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...
- C语言中malloc函数的理解
在C语言中malloc函数主要是用在堆内存的申请上,使用malloc函数时,函数会返回一个void *类型的值,这个值就是你申请的堆内存的首地址:为什么返回的地址是一个void *类型的地址呢?首先我 ...
- C语言中malloc函数的使用方法
C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...
- C语言中getopt()和getopt_long()函数的用法
一.参考文章 1.C语言中getopt()和getopt_long()函数的用法 2.linux 中解析命令行参数 (getopt_long用法) 二.调试经验
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- C 语言中 malloc、calloc、realloc 和free 函数的使用方法
C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自 ...
- C语言中 malloc
参考:https://blog.csdn.net/kokodudu/article/details/11760863 一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: ...
随机推荐
- 如何启动app时全屏显示Default.png(图片)?
- EasyUI中Grid标题居中方法(jquery实现方法)
$(".panel-title").css("text-align", "center"); 一句话搞定,就是这么随意
- 关于用photoshop制作海报
最近由于事情比较多,一直忙着各项活动的策划,而我所在的学社联和金山俱乐部都组织了ps的培训,也要求上交一些海报,在积极熟悉ps cs6中. 就昨天做的光棍节脱单海报来讲,稍微运用了笔刷等最基础的工具. ...
- 移动销售端app的需求分析
随着网络时代的发展,人们对于网络的依赖越来越大,网上购物便成了一个很大的消费者市场.. 如何分析一个综合的移动销售端app的需求我认为首先要确定用户,从用户的角度一个一个功能过,评估每一个功能的需求, ...
- Android上传图片到服务器
一.android需要导入异步请求的jar包 AsyncHttpClient public static void reg(final Context cont,Bitmap photodata,S ...
- Objective C运行时(runtime)
#import <objc/runtime.h> void setBeingRemoved(id __self, SEL _cmd) { NSLog(@"------------ ...
- phpMyAdmin上传文件大小限制
今日偶然要导一张数据表至mysql数据库中,但发现文件为2.9M,导入失败. 看一下返回的错误原因为文件超过2M的大小限制,郁闷. 找了一下“越狱”的方法,需要修改php.ini和phpmyadmin ...
- Linux学习之路—Linux文件权限
内容来源于鸟哥私房菜 1.Linux文件属性 1)第一列为文件类型与权限 第一个字符表示文件的类型: [d]表示目录 [-]表示文件 [l]表示连接文件 [b]表示设备文件中可供存储的接口设备,例如硬 ...
- Hbuilder与svn快速连接并在手机上测试页面
大家好,今天讲一下Hbuilder怎样与svn连接在一起,并且在移动端上面做真是的页面测试. 1,打开Hbuilder软件,在工具中,安装插件,找到svn插件安装. 2.点击文件,导入,从svn中检测 ...
- 基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串、list集合(MVC5)<二>
上篇博客给大家介绍了基于Bootstrap的JQuery TreeView树形控件,数据支持json字符串.list集合(MVC5)<一>, 其中的两种方式都显得有些冗余.接着上篇博客继续 ...