`
mixer_a
  • 浏览: 338305 次
社区版块
存档分类
最新评论

C语言内存动态分配与释放

 
阅读更多

一、内存分配

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

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

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

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

二、动态分配

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

1、void *malloc(size_t size)

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

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

在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。

分享到:
评论

相关推荐

    操作系统~内存动态分配与释放

    使用C语言实现内存的动态分配与释放的模拟

    C语言内存分配详解

    如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。 全局区:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。 文字常量区:例如char *c = “123456”;则”...

    C语言 动态内存分配详解

    C语言 动态内存分配详解 动态内存分配涉及到堆栈的概念:堆栈是两种数据结构。堆栈都是数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。 栈(操作系统):由操作系统自动分配释放 ,...

    C语言内存分配问题(整理)

    C语言内存分配相关资料整理。包括C中内存分区、内存分配方式、常见的内存错误及其对策和动态分配释放内存举例。

    基于C语言的动态内存分配器.zip

    动态内存分配器维护者一个进程的虚拟内存区域堆,每个块就是一个连续的虚拟内存片,已分配的块显式的保留为供应用程序使用,空闲块可用来分配。空闲块保持空闲,直到它显示的被应用所分配。一个已分配的块保持已分配...

    C语言内存管理与联合结构课件笔记.md

    通过学习可以全面掌握C语言中的内存分配与释放方法,避免内存泄漏等问题。还可以熟练使用结构体与联合进行数据组织。 使用建议: 重点学习内存管理部分的技巧与注意事项,掌握动态内存分配的方法。数据结构部分的示例...

    C语言动态内存分配的详解

    C语言动态内存分配的详解 1.为什么使用动态内存分配 数组在使用的时候可能造成内存浪费,使用动态内存分配可以解决这个问题。 2. malloc和free C函数库提供了两个函数,malloc和free,分别用于执行动态内存分配和...

    C语言内存分布图(计算机基础知识)

     全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。  常量存储区,这是一块比较特殊的...

    c语言动态内存分配知识点及实例

    c语言怎么实现动态内存分配 我们经常会预先给程序开辟好内存空间,然后进行操作。 int arr[5] ; 对这个数组我们在定义的时候必须给提前开辟好空间,并且在程序执行的过程中,这个开辟的内存空间是一直存在的,除非...

    链表的C语言实现之动态内存分配

    所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是...

    存储器模拟分配算法 OS实验 操作系统实验 C语言

    (1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 (2) 假设初始状态下...

    C语言中的内存管理

    内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。其主要的目的是如何高校、快捷的分配,并且在适当的时候释放和回收内存资源...故了解C语言中的内存是怎么分配的,就可以高效、快速的达到内存的合理分配

    内存分配简单的c语言

    要求实现一个内存分配程序,其中要设置malloc()和free()函数。Malloc函数可以用来分配相应空间给进程使用,而free函数用来表示程序退出时释放内存。存储分配要求首次适配方法实现,而释放内存之后会对相邻空间的...

    计算机操作系统实验_动态分区分配方式模拟

    空闲分区通过空闲区链进行管理,在内存分配时,优先考虑低地址部分的空闲区。 2.分别采用首次适应算法、最佳适应算法和最坏适应算法模拟内存空间的动态分配与回收,每次分配和回收后显示出空闲区链的详细情况(说明...

    C语言 动态内存分配的详解及实例

    (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息:void* malloc(size_t size); (4)free 用于将动态内存归还系统:

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

    如果要给二维数组(m*n)分配空间,代码可以写成下面: 代码如下:char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是...释放应该是: 代码如下:int i; for(i=0;i<m;i++)  free((void *)a[i

    C/C++动态分配与释放内存的区别详细解析

    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块。如果分配成功则返回指向被分配内存的指针...

    C语言内存池使用模型

    在用C语言开发时,特别是在服务器端,内存的使用会成为系统性能的一个瓶颈,如频繁的分配和释放内存,会不断的增加系统的内存碎片,影响内核之后分配内存的效率,这个时候一个比较可行的做法是采用内存池,先分配好...

    C语言动态内存分配之malloc与realloc区别

    在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap)。还有另一个内存区域,称为栈(stack),...  C函数库中的malloc和free分别用于执行动态内存分配和释放。这两个函数的原型如下所示,他们都在头文件st

    C语言内存管理

    关于C语言中内存处理的文档。包括内存泄漏处理以及内存合理分配和释放

Global site tag (gtag.js) - Google Analytics