• malloc函数和free函数

    • malloc函数原型:void *malloc(long NumBytes)
    • malloc原型说明:mallco函数在堆分配了NumBytes个字节的内存空间,用来存放数据,并返回了指向该内存的指针,如果分配失败,则会返回一个NULL指针(申请到的实际空间要比申请的空间大),该内存空间在malloc函数执行完成后不会被初始化,它的值是未知的,如果希望在分配内存的同时初始化,请使用calloc函数,这在下面会有介绍。
    • free函数原型:void free(void *FirstByte)
    • free原型说明:free函数的作用就是将用malloc函数申请到的内存空间释放掉
  • 举个栗子:
 char* ptr = NULL;
//malloc函数的参数表示申请一个可存储100个char类型的空间
//由于malloc函数返回的是一个未知类型指针,所以需要强转成与自己申请数据匹配的类型
//此处强转为char*
ptr = (char*)malloc( *sizeof(char)) //需要判断内存空间是否申请成功
if (ptr == NULL){
std::cout << “malloc failli.” << std::end;
exit();
} //此时内存空间就已经申请成功了 //接下来就是不再需要这块内存空间时,需要手动释放掉,可使用free函数
free(ptr);
ptr = NULL;
//此处在将ptr释放掉之后还要置0是因为,free只是释放掉了申请的内存空间中的数据,但是p还是在指向着那块内存区域,用下面的例子说明会清晰一点
int main(){
char *ptr = NULL;
ptr = (char*)malloc( * sizeof(char))
print(“before free ,p = %p”,ptr);//%p类似于%s表示格式化的字符串,不过%p表示的是指针
free(ptr);
print(“after free,p = %p”,ptr); return ;
} //输出如下:
before free,p = 0x8fa7008
after free,p = 0x8fa7008
//如此可见,free之后只是将内存中释放,但ptr还是指向那块内存区域,如果在后续还会对ptr进行判断的话,就会出现奇奇怪怪的事情
//所以在free之后最好还是将其置为NULL

Tip:

  • 申请内存空间存在申请失败的情况,所以在malloc之后需要检查是否申请成功,判断指针是否为NULL
  • 当不再使用内存时,需要手动释放掉,free之后要记得将指针置为NULL,以防止后面还会使用
  • malloc函数和free函数应该配对使用,申请不释放会造成内存泄露,要谨记只能释放一次,如果重复释放会报错(空指针除外)

calloc函数:

  • 函数原型:void* calloc(size_t num,size_t size);
  • 函数说明:calloc函数在内存中动态的分配num个长度为size的连续空间,并将每一个字节都初始化为0,所以该函数是分配了(num*size)个字节长度的空间,并且每一个字节的值都为0.
  • 返回值:分配成功则返回指向该内存的地址,分配失败则返回NULL
  • 举例说明:
 char *ptr = (chae*)calloc(,);
//分配10个大小为10字节的连续空间,并将这100个字节都初始化为0
  • calloc函数和malloc函数的最大区别就是calloc函数在动态分配内存之后会自动初始化该内存空间为0,而malloc函数不会进行初始化,申请的空间内都是未知的垃圾数据

malloc函数、calloc函数和free函数的更多相关文章

  1. malloc realloc calloc free

    自上次发现自己对这几个C函数不熟悉,就打算抽空整理一下,也就现在吧.这几个函数都是跟堆内存打交道的,还有一个好玩的函数--alloca,它是跟栈内存打交道的,我想留在以后研究出好玩点的来,再专门为其写 ...

  2. Linux C 堆内存管理函数malloc()、calloc()、realloc()、free()详解

    C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般 ...

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

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

  4. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

  5. malloc、calloc、realloc函数说明

    malloc 函数 #include <stdlib.h> void* malloc(int n); n为要分配的字节数,如果成功,返回获得空间的首地址,如果分配失败,则返回NULL,ma ...

  6. CreateThread函数&amp;&amp;CString::GetBuffer函数

    对这个两个常见的windows下的函数学习了一下: //最简单的创建多线程实例 #include <stdio.h> #include <windows.h> //子线程函数 ...

  7. C语言可重入函数和不可重入函数

    可重入函数和不可重入函数的概念 在函数中如果我们使用静态变量了,导致产生中断调用别的函数的 过程中可能还会调用这个函数,于是原来的 静态变量被在这里改变了,然后返回主体函数,用着的那个静态变量就被改变 ...

  8. UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数

    信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止.   1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...

  9. java mysql自定义函数UDF之调用c函数

    正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...

  10. 逆向 time.h 函数库 time、gmtime 函数

    0x01 time 函数 函数原型:time_t time(time_t *t) 函数功能:返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位.如果 se ...

随机推荐

  1. 吴裕雄--天生自然java开发常用类库学习笔记:SortedSet接口

    import java.util.SortedSet ; import java.util.TreeSet ; public class TreeSetDemo05{ public static vo ...

  2. python -- 相对路径、绝对路径、以及路径的获取

    1.定义 绝对路径:就是文件的真正存在的路径,是指从硬盘的根目录(盘符)开始,进行一级级目录指向文件.   相对路径:就是以当前文件为基准进行一级级目录指向被引用的资源文件. ../ 表示当前文件所在 ...

  3. java 三羊献瑞

    三羊献瑞 观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字. 请你填写"三羊献瑞"所代表的4位数字(答案唯一),不要填写任何多余内容. public ...

  4. POJ - 2456 Aggressive cows(二分+贪心)

    题意:把c个牛分进n个摊位,摊位位置已知,所有摊位分布在0 <= xi <= 1,000,000,000,问两头牛间最小距离的最大值. 分析:找所有最小距离取个最大的.所以二分找这个最小的 ...

  5. Linux在实际中的应用

    各位童鞋们,你们是如何度过这周周末的呢?这周末的我在家学习学习再学习,然而学习到一半,公司领导突然给我打了个电话过来说有同事等会儿会去客户那部署无人值守安装系统服务,问我去不去学习下.我想我正在学Li ...

  6. codeforces 586B:Laurenty and Shop

    B. Laurenty and Shop time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. idea开发springboot 的mysql数据库连接问题

    今天在家用idea进行springboot开发,前面一些坑相对避免了,但是到数据库这块总是连接不上,报错主要是: Access denied for user 'root'@'localhost' ( ...

  8. Emacs: 设置窗口标题格式

    Emacs默认的窗口标题常常比较简单,例如我的默认标题是"emacs@ubuntu".如果想要在标题中显示更多的信息,我们可以对它进行一些设置.由于Emacs的可扩展性,这种修改实 ...

  9. PlayJava SpringMVC与Struts2杂谈

    一 先做一个简单对比: 1. SpringMVC的入口是Servlet,核心是DispatcherServlet,Struts2是Filter,核心是FilterDispatcher 2. Sprin ...

  10. Java IO流学习总结(转)

    原文地址:http://www.cnblogs.com/oubo/archive/2012/01/06/2394638.html Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 ...