C语言内存动态分配与释放
一、内存分配
对于内存的分配,主要采用的是标记法。
分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配。例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配。
另一种方法是动态分配,动态分配是指程序在运行时为它分配内存。
分配内存的时候,对于已分配的内存,操作系统会给一个标记,未分配的内存,操作系统也会有一个标记,操作系统辨别内存是否可以使用就是通过标记判断,当内存释放的时候,就会修改标记。
二、动态分配
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语言内存动态分配与释放相关推荐
- 内存动态分配与释放,malloc和new区别
1. C语言的函数malloc和free (1) 函数malloc和free在头文件<stdlib.h>中的原型及参数 void * malloc(size_t size) 动态配置内 ...
- c语言内存分配与释放 不同类别变量的内存分配和释放的区别
1.不同变量使用内存的区别 静态存储类别的变量:内存数量在编译时确定,程序开始执行时创建,程序结束时销毁.(static.const) 自动存储类别的变量:程序进入变量定义所在块时存在,离开块时销毁. ...
- C语言内存的动态分配
全局变量是分配在内存中的动态存储区的,非静态的局部变量包括形参是分配在内存中的动态存储区的,这个存储区是一个称为栈的区域,除此之外,C语言还允许建立内存动态分配区域,以存放一些临时用的数据,这些数据不 ...
- c语言增加动态分配的存储空间吗,C语言 关于内存动态分配问题
全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...
- c与c++分别是怎样动态分配和释放内存的,有什么区别?(转)
查了查资料,总结了以下几点: 一.先来谈谈在C语言下,动态内存分配和释放的特点. 动态分配内存的定义是这样的,指在程序运行过程中,要申请内存,系统会根据程序的实际情况来分配,分配空间的大小是由程序的需 ...
- C语言调用 free 函数释放内存后指针指向及内存中的值是否改变的问题
文章目录 1. 前言 2. 正文 2.1. "分配" 与 "释放" 2.2. 运行测试 2.2.1. VSCode 下使用 gcc 编译 2.2.2. VS20 ...
- C语言中多维数组的内存分配和释放(malloc与free)(转)
C语言中多维数组的内存分配和释放(malloc与free)(转) 写代码的时候会碰到多维数组的内存分配和释放问题,在分配和释放过程中很容易出现错误.下面贴上一些示例代码,以供参考. 如果要给二维数组( ...
- 【C 语言】结构体 ( 结构体中嵌套一级指针 | 分配内存时先 为结构体分配内存 然后再为指针分配内存 | 释放内存时先释放 指针成员内存 然后再释放结构头内存 )
文章目录 一.结构体中嵌套一级指针 1.声明 结构体类型 2.为 结构体 变量分配内存 ( 分配内存时先 为结构体分配内存 然后再为指针分配内存 ) 3.释放结构体内存 ( 释放内存时先释放 指针成员 ...
- php的内存划分,解析PHP中的内存管理,PHP动态分配和释放内存
摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存 在PHP中,填 ...
最新文章
- Oracle 游标(cursor) 说明
- 程序员数学基础【六、枚举 区块链,虚拟币种、币包约束,内环版本】(Java版本)
- java enum分析
- 为什么要用内插字符串代替string.format
- 用一个单链表L实现一个队列(算法导论第十章10.2-3)
- 混合多云架构_混合多云每个人都应避免的3个陷阱(第1部分)
- 解决 No projects are available for deployment to this server!
- 我帮公司财务写了个“群发工资条”的 Python 脚本!
- OSError: Initializing from file failed
- linux 监控系统资源-内存
- Visual Basic从入门到精通pdf
- 本地测试微信公众号推送模板
- lopatkin俄大神精简中文系统 Windows 10 Pro 10240.16393.150717-1719.th1_st1 x86-x64 CN Tablet PC FINAL...
- 顺序栈和链栈实现汉洛塔
- Farkas'Lemma 和 S-Lemma
- 华为云磁盘挂载与分区扩容
- debian10 安装ffmpeg
- 机器学习-SVM算法
- ESP8266 MP3制作——关于SelectionList从源码中改代码的一次经历
- 红米4高配版_标注:2016060_官方线刷包_救砖包_解账户锁