最近在复习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函数的理解的更多相关文章

  1. ZH奶酪:C语言中malloc()和free()函数解析

    1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败 ...

  2. C语言中malloc()和calloc()c函数用法

    C语言中malloc()和calloc()c函数用法   函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...

  3. C语言中malloc函数返回值是否需要类型强制转换问题

    1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...

  4. C语言中malloc函数的理解

    在C语言中malloc函数主要是用在堆内存的申请上,使用malloc函数时,函数会返回一个void *类型的值,这个值就是你申请的堆内存的首地址:为什么返回的地址是一个void *类型的地址呢?首先我 ...

  5. C语言中malloc函数的使用方法

    C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...

  6. C语言中getopt()和getopt_long()函数的用法

    一.参考文章 1.C语言中getopt()和getopt_long()函数的用法 2.linux 中解析命令行参数 (getopt_long用法) 二.调试经验

  7. C语言中 malloc函数用法

    一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...

  8. C 语言中 malloc、calloc、realloc 和free 函数的使用方法

    C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自 ...

  9. C语言中 malloc

    参考:https://blog.csdn.net/kokodudu/article/details/11760863 一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: ...

随机推荐

  1. unity文件解析以及版本控制

    刚开始使用unity做开发时,拿到一个范例工程先上传SVN,之后再自己做一些修改后,发现有非常多文件都有变化,这才知道有很多本地生成的文件,是不用上传的,但是不知道哪些才是需要共用的.之后又困扰于修改 ...

  2. mongodb C# 驱动查询

    INoSqlProvider provider = NoSqlManager.Create("CloudTable"); IMongoCollection<FormMongo ...

  3. div中显示页面

    在css中显示页面,在页面布局中很多时候都要在一个div 里显示某些页面.在这里写下我用到的一种方式. <script type="text/javascript"> ...

  4. CKEditor使用配置方法

    一.使用方法: 1.在页面<head>中引入ckeditor核心文件ckeditor.js <script type="text/javascript" src= ...

  5. NGUI实现ScrollView功能

    NGUI,目前Unity3D Assert Store中最火的2D图形界面工具. 本文假设读者有Unity3D使用经验.有基本了解.NGUI3.6.0 1.新建Pannel(Scroll View), ...

  6. 6.Counting Point Mutations

    Problem Figure 2. The Hamming distance between these two strings is 7. Mismatched symbols are colore ...

  7. 今天第一次接触到typescript,看了第一个知识点就是变量的声明,来回忆回忆,做做笔记

    以前只用过JavaScript原生写网站特效,今天还是第一次听说typescript的,然后看了一下它的基本知识,感觉很像Java,真的太像了,但是又有不同点.很让我惊奇看到的第一个知识点就和以前不同 ...

  8. 浅谈JavaScript eval() 函数

    用js的人都应该知道eval()函数吧,虽然该函数用的极少,但它却功能强大,那么问题来了,为什么不常用呢?原因很简单,因为eval()函数是动态的执行其中的字符串,里面有可能是脚本,那么这样的话就有可 ...

  9. Joomla及其类似软件的说明分析

    Joomla不单单是一款免费的软件,还是在国外相当知名的及内容管理.web开发及手机应用开发等为一体的一套系统.Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux. W ...

  10. 苹果Xcode 证书生成、设置、应用完整图文教程

    Xcode 证书生成.设置.应用,与大家分享. 为了能够在iPhone或iPod Touch上运行iPhone应用程序,必须使用有效的数字证书签名.这个证书用于将您的开发者身份与在注册期间所提供的已确 ...