1介绍

在C语言的开发学习中,经常要进行内存分配,动态内存分配技术可以保证在程序运行过程中按照实际需要申请适量的内存,使用结束后释放。C语言跟内存申请相关的函数主 要有alloca、 calloc、 malloc、 free、 realloc、 sbrk 等。在实际学 习中主要通过调用库函数malloc 0和free 0来进行内存的分配和释放。

2函数的基本用法

2.1分配内存函数malloc

调用形式: (类型说明符*) malloe (size) ;

功能:在内存的动态存储区中分配-块长度为“size" 字节的连续区域。函数的返回值为该区域的首地址。

“类型说明符”表示把该区域用于何种数据类型。

(类型说明符*)表示把返回值强制转换为该类型指针。“size"是一个无符号数。

例如:

pc= (char *) malloc (100) ;

表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。

2.2释放内存空间函数 free

调用形式: free (void *ptr) ;

功能:释放ptr所指向的一块内存空间,ptr 是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是 由malloc 或calloe函数所分配的区域。

3 malloc 0和free 0的存储机制

3.1堆

堆是共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是用完了要还给操作系统,否则就会内存泄漏。

3.2栈

栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个丽数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动地切换栈,就是切换SS/ESP寄存器。

3.3 malloe 0分配内存

malloc 0从堆里面获得空间,也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

3.4 free 0释放内存

free ()释放的是指针指向的内存。指针是-一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还存在,只不过现在指针指向的内容是无用的,未定义的。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被引用。

4总结

malloc与free是C语言的标准库函数,当使用malloe() 申请了内存空间后,必须检查是否分配成功,而且malloc (和free(必须是配对使用。当不需要再使用申请的内存时, 必须使用free 0释放,释放后应该把指向这块内存的指针指向NULL,以免分配的空间占着不用,造成内存泄露。

C语言中malloc函数及free函数用法相关推荐

  1. C语言中malloc函数及free函数用法(定义动态数组及释放)

    一.关于静态数组.动态数组 二.malloc()和free()的基本概念以及基本用法 1.函数定义 2.函数用法 3.关于函数使用注意事项 三.malloc()函数分配内存空间的由来 四.malloc ...

  2. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...

  3. C语言中的rename()和remove()函数的使用及注意点

    C语言中的rename()和remove()函数的使用及注意点 C语言中rename() 和remove()函数属于文件处理函数,其中rename() 对文件或目录进行移动和删除. int ret = ...

  4. c语言malloc作用,c语言中malloc是什么?怎么用?

    c语言中malloc是什么?怎么用? malloc() 函数用来动态地分配内存空间,其原型为:void* malloc (size_t size); 说明: [参数说明] size 为需要分配的内存空 ...

  5. c++freopen函数_使用示例的C语言中的freopen()函数

    c++freopen函数 C语言中的freopen()函数 (freopen() function in C) Prototype: 原型: FILE* freopen(const char *str ...

  6. putc函数_C语言中的putc()函数与示例

    putc函数 C语言中的putc()函数 (putc() function in C) The putc() function is defined in the <stdio.h> he ...

  7. c语言中的printf函数_C语言中的printf()函数与示例

    c语言中的printf函数 C语言中的printf()函数 (printf() function in C) The printf() function is defined in the <s ...

  8. c语言中rewind函数_C语言中的rewind()函数与示例

    c语言中rewind函数 C中的rewind()函数 (rewind() function in C) The rewind() function is defined in the <stdi ...

  9. fopen函数的用法示例_使用示例的C语言中的fopen()函数

    fopen函数的用法示例 C语言中的fopen()函数 (fopen() function in C) Prototype: 原型: FILE *fopen(const char* filename, ...

  10. c语言putchar函数_C语言中的putchar()函数与示例

    c语言putchar函数 C语言中的putchar()函数 (putchar() function in C) The putchar() function is defined in the < ...

最新文章

  1. NC:北京大学吴华君-基因组3D结构调控胚胎干细胞分化
  2. FPGA中实现对数运算
  3. java基础笔试_java基础笔试题
  4. python怎么加图片_怎么在图片旁边加文字 python如何在图片上添加文字 - 励志 - 52资讯网...
  5. Codeforces Round #703 (Div. 2) 题解
  6. leetcode —— 523. 连续的子数组和
  7. 724A - CAN总线
  8. X86汇编语言从实模式到保护模式11:指令格式及操作尺寸
  9. 魔鬼作坊端游脱机封包辅助制作
  10. ghost系统好,还是原版安装的好!!!!????????????
  11. 题目 2260: 求arccos值
  12. 搭建一条区块链需要多少时间和资金
  13. PDF页码怎么设置?如何给PDF文件设置页码
  14. GraphQL:你的容颜,十万光年
  15. wps插入I,II,III类的页码
  16. 解题笔记(15)——几个栈和递归的问题
  17. f开头的流媒体软件_流媒体直播工具(Streamon)
  18. 【Java面试题】大厂Java面试题分享
  19. TTL的含义是什么?
  20. C#技巧 Lazy(延迟初始化)用法

热门文章

  1. 三创数据分析题库及个人作答
  2. Weblogic 用户名密码写入配置文件的方法
  3. Matlab GUI鼠标画线
  4. (Win10详细版)JDK 安装与环境变量配置
  5. [黑马程序员课程记录]C++基础部分1
  6. 关于虚拟机win10 突然登陆不进去可能的解决方法
  7. 在一台服务器上搭多个网站的解决方案
  8. 如何找到和保存Windows10的聚焦图片
  9. 解决ORA-01033: ORACLE initialization or shutdown in progress
  10. 阿里-----数组四等分