一、内存分配

对于内存的分配,主要采用的是标记法。

分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配。例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配。

另一种方法是动态分配,动态分配是指程序在运行时为它分配内存。

分配内存的时候,对于已分配的内存,操作系统会给一个标记,未分配的内存,操作系统也会有一个标记,操作系统辨别内存是否可以使用就是通过标记判断,当内存释放的时候,就会修改标记。

二、动态分配

C函数库关于内存的动态分配和释放提供了四个函数malloc、calloc、realloc和free。其中前三个是执行内存动态分配,最后一个是执行释放。

1、void *malloc(size_t size)

malloc函数所需要的参数是要分配的字节长度,例如

int *p; p = (int *)malloc(100);

对于上面的代码,如果一个整数占有四个字节的话,将会分配25个整数的内存。为了增加代码的可移植性,如果要分配25个整数的内存,应将代码改为

int *p; p = (int *)malloc(25*sizeof(int));

在molloc函数分配内存时,会从内存中提取一块合适大小的内存,并返回该块内存的首地址,这块内存并没有被初始化。对于这种方法,必然会有问题出现,就是可用内存的大小不能满足请求所需要的内存,此时,malloc函数返回NULL。所以,使用malloc函数分配内存之后,并不能保证内存分配成功,在使用的时候,应该先判断指针是否为NULL,如果不为NULL,则说明分配成功,可以使用。否则,反之。

2、void *calloc(size_t num_elements,size_t element_size)

calloc函数所需要的参数是元素的个数和元素的字节长度,之所以要这两个参数,是因为使用calloc函数在分配内存的时候,会对内存进行初始化,如果要初始化,就需要知道一个元素是多大,为了计算总的内存大小,还应该知道元素的个数。

calloc函数与malloc函数的主要差别就是在返回首地址的指针之前,对进行了初始化,如果在程序只是想将一些值存放到数组中,那么这个初始化就纯属浪费。

3、void *realloc(void *ptr,size_t new_size)

relloc函数需要的参数为原来内存的首地址新的内存的长度。

realloc函数用于修改已经分配内存的大小,使用这个函数可以将一块内存扩大或缩小。如果扩大一块内存,那么这块内存原先的内容必然会被保留,新增加的内存添加到原来内存的后面;如果缩小,对于尾部的内存会被释放。

对于扩大内存,依然存在内存不够的问题,如果分配不成功,就会返回NULL。除此之外,还有另一个问题,就是扩大内存的时候,不可修改原来内存的大小,此时系统将会重新分配一块内存,将原来内存的数据复制到新的内存中,所以使用realloc函数修改内存大小之后,应该使用realloc函数返回的指针而不是原来的指针。

4、void free(void *pointer)

free函数所需要的参数是一个指针,功能是将指针指向的内存区域释放(通过修改标记实现),以便内存可以重新使用。

free函数释放的只是指针指向的内存,指针所占用的空间并未被改变,调用free函数之后,指针所指向的地址仍然不变,如果在程序的后面,重新分配到了该指针指向的内存,使用现在的指针也可访问,但是不安全。此时,该指针被叫做野指针,为了避免野指针,应在调用free函数之后,将指针的值置为NULL。

转载于:https://www.cnblogs.com/JPAORM/archive/2012/05/16/2510083.html

C语言内存动态分配与释放相关推荐

  1. 内存动态分配与释放,malloc和new区别

    1.   C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内 ...

  2. c语言内存分配与释放 不同类别变量的内存分配和释放的区别

    1.不同变量使用内存的区别 静态存储类别的变量:内存数量在编译时确定,程序开始执行时创建,程序结束时销毁.(static.const) 自动存储类别的变量:程序进入变量定义所在块时存在,离开块时销毁. ...

  3. C语言内存的动态分配

    全局变量是分配在内存中的动态存储区的,非静态的局部变量包括形参是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域,除此之外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不 ...

  4. c语言增加动态分配的存储空间吗,C语言 关于内存动态分配问题

    全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...

  5. c与c++分别是怎样动态分配和释放内存的,有什么区别?(转)

    查了查资料,总结了以下几点: 一.先来谈谈在C语言下,动态内存分配和释放的特点. 动态分配内存的定义是这样的,指在程序运行过程中,要申请内存,系统会根据程序的实际情况来分配,分配空间的大小是由程序的需 ...

  6. C语言调用 free 函数释放内存后指针指向及内存中的值是否改变的问题

    文章目录 1. 前言 2. 正文 2.1. "分配" 与 "释放" 2.2. 运行测试 2.2.1. VSCode 下使用 gcc 编译 2.2.2. VS20 ...

  7. C语言中多维数组的内存分配和释放(malloc与free)(转)

    C语言中多维数组的内存分配和释放(malloc与free)(转) 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组( ...

  8. 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )

    文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...

  9. php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存

    摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存 在PHP中,填 ...

最新文章

  1. Oracle 游标(cursor) 说明
  2. 程序员数学基础【六、枚举 区块链,虚拟币种、币包约束,内环版本】(Java版本)
  3. java enum分析
  4. 为什么要用内插字符串代替string.format
  5. 用一个单链表L实现一个队列(算法导论第十章10.2-3)
  6. 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
  7. 解决 No projects are available for deployment to this server!
  8. 我帮公司财务写了个“群发工资条”的 Python 脚本!
  9. OSError: Initializing from file failed
  10. linux 监控系统资源-内存
  11. Visual Basic从入门到精通pdf
  12. 本地测试微信公众号推送模板
  13. lopatkin俄大神精简中文系统 Windows 10 Pro 10240.16393.150717-1719.th1_st1 x86-x64 CN Tablet PC FINAL...
  14. 顺序栈和链栈实现汉洛塔
  15. Farkas'Lemma 和 S-Lemma
  16. 华为云磁盘挂载与分区扩容
  17. debian10 安装ffmpeg
  18. 机器学习-SVM算法
  19. ESP8266 MP3制作——关于SelectionList从源码中改代码的一次经历
  20. 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁

热门文章

  1. cocos3 动作回调函数
  2. 用Eclipse写java
  3. openCVPracticalExercise学习笔记04
  4. 手把手教你从0-1做一张酷炫驾驶舱,让老板对你赞不绝口
  5. 论制造业的报表开发项目需求
  6. IDEA导入Eclipse项目的方法步骤(图文教程)
  7. 小白python自学—报错问题汇总(持续更新)
  8. 线性回归与梯度下降算法
  9. pythonturtle库画图_python 用turtle库画图
  10. php变量值传递,PHP将值传递到包含文件中的变量