`

内存分配 C语言:malloc()函数与alloc()函数

    博客分类:
  • C
阅读更多

本文介绍C语言的malloc()函数与alloc()函数。

  C语言跟内存分配方式

  (1) 从静态存储区分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。

  (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

  (3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多

  C语言跟内存申请相关的函数主要有 alloca,calloc,malloc,free,realloc,sbrk等.

  其中alloca是向栈申请内存,因此无需释放. malloc分配的内存是位于堆中的,并且没有初始化内存的内容,因此基本上malloc之后,调用函数memset来初始化这部分的内存空间.

  calloc则将初始化这部分的内存,设置为0. 而realloc则对malloc申请的内存进行大小的调整.申请的内存最终需要通过函数free来释放. 而sbrk则是增加数据段的大小;

  malloc/calloc/free基本上都是C函数库实现的,跟OS无关.C函数库内部通过一定的结构来保存当前有多少可用内存.如果程序malloc的大小超出了库里所留存的空间,那么将首先调用brk系统调用来增加可用空间,然后再分配空间.free时,释放的内存并不立即返回给os,而是保留在内部结构中. 可以打个比方: brk类似于批发,一次性的向OS申请大的内存,而malloc等函数则类似于零售,满足程序运行时的要求.这套机制类似于缓冲.

  使用这套机制的原因: 系统调用不能支持任意大小的内存分配(有的系统调用只支持固定大小以及其倍数的内存申请,这样的话,对于小内存的分配会造成浪费; 系统调用申请内存代价昂贵,涉及到用户态和核心态的转换. 函数malloc()和calloc()都可以用来分配动态内存空间,但两者稍有区别。

  malloc()函数有一个参数,即要分配的内存空间的大小:

  Void *malloc(size_t size);

  calloc()函数有两个参数,分别为元素的数目和每个元素的大小,这两个参数的乘积就是要分配的内存空间的大小:

  void*calloc(size_t numElements,size_t sizeOfElement);

  如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。

  malloc() 函数和calloc()函数的主要区别是前者不能初始化所分配的内存空间,而后者能。如果由malloc()函数分配的内存空间原来没有被使用过,则其中 的每一位可能都是0;反之,如果这部分内存空间曾经被分配、释放和重新分配,则其中可能遗留各种各样的数据。也就是说,使用malloc()函数的程序开 始时(内存空间还没有被重新分配)能正常运行,但经过一段时间后(内存空间已被重新分配)可能会出现问题。

  calloc() 函数会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为零;如果你是 为指针类型的元素分配内存,那么这些元素通常(但无法保证)会被初始化为空指针;如果你是为实数类型的元素分配内存,那么这些元素可能(只在某些计算机 中)会被初始化为浮点型的零。

  malloc() 函数和calloc()函数的另一点区别是calloc()函数会返回一个由某种对象组成的数组,但malloc()函数只返回一个对象。为了明确是为一 个数组分配内存空间,有些程序员会选用calloc()函数。但是,除了是否初始化所分配的内存空间这一点之外,绝大多数程序员认 为以下两种函数调用方式没有区别:

 


  calloc(numElements ,sizeOfElement);
  malloc(numElements *sizeOfElement) ;

 

  需要解释的一点是,理论上(按照ANSIC标准)指针的算术运算只能在一个指定的数组中进行,但是在实践中,即使C编译程序或翻译器遵循这种规定,许多C 程序还是冲破了这种限制。因此,尽管malloc()函数并不能返回一个数组,它所分配的内存空间仍然能供一个数组使用(对realloc()函数来说同 样如此,尽管它也不能返回一个数组)。

  总之,当你在calloc()函数和malloc()函数之间作选择时,你只需考虑是否要初始化所分配的内存空间,而不用考虑函数是否能返回一个数组。

  当程序运行过程中malloc了,但是没有free的话,会造成内存泄漏.一部分的内存没有被使用,但是由于没有free,因此系统认为这部分内存还在使用,造成不断的向系统申请内存,是的系统可用内存不断减少.但是,内存泄漏仅仅指程序在运行时,程序退出时,OS将回收所有的资源.因此,适当的重起一下程序,有时候还是有点作用。

 

分享到:
评论

相关推荐

    c语言中所有函数大全

    C语言中涉及内存管理的部分函数主要位于`alloc.h`或`stdlib.h`中,这些函数提供了动态内存分配、释放以及调整等功能。 ##### brk **功能**:更改数据段空间的分配。 **原型**: ```c int brk(void* endds); ``` ...

    linux c内存分配函数介绍

    在Linux C中,内存分配函数是非常重要的一部分,例如malloc, kmalloc, zalloc等等。这些函数都有其特点和使用场景。 首先,让我们来看一下typedef和#define的区别。typedef只是为了增加可读性而为标识符另起的新...

    c语言 malloc函数详解

    谈到malloc函数相信学过c语言的人都很熟悉,但是malloc底层到底做了什么又有多少人知道。 1、关于malloc相关的几个函数 关于malloc我们进入Linux man一下就会得到如下结果:   也可以这样认为(window下)...

    动态内存分配 的方法(C语言)

    在C语言中,动态内存分配是一项关键技能,它允许程序在运行时根据需要分配和释放内存。本篇文章将深入探讨动态内存分配的方法,包括`malloc()`、`calloc()`、`realloc()`以及`free()`函数,并解释如何使用这些函数来...

    内存分配与释放 alloc,free

    `alloc`和`free`通常指的是动态内存分配和释放的函数,它们在C语言的标准库`stdlib.h`中被定义。`malloc()`函数是C语言中用于动态分配内存的,它接受一个整型参数,表示要分配的字节数,返回一个指向分配内存的指针...

    malloc函数的声明

    `malloc()`函数是C语言中用于动态内存分配的关键函数,它位于C标准库中的`<stdlib.h>`头文件中。动态内存分配允许程序在运行时根据需要分配内存,而不是在编译时固定内存布局。这在处理不确定或可变大小的数据结构时...

    基于malloc与free函数的实现代码及分析

    本文将深入探讨这两个函数的实现原理,帮助读者理解内存分配和释放的内部机制。 首先,malloc函数负责在运行时为程序分配指定大小的内存块。它的基本思想是维护一个内存池,当需要内存时,从池中找到合适大小的空闲...

    C语言头文件包含的函数

    stdlib.h头文件提供了一些函数,用于杂项函数和内存分配,例如malloc、calloc、realloc等函数。这些函数可以帮助程序员实现杂项函数和内存分配。 string.h string.h头文件提供了一些函数,用于字符串处理,例如...

    alloc.h头文件

    `malloc.h`是C语言中的一个头文件,主要提供动态内存分配的函数,如`malloc()`、`calloc()`、`realloc()`和`free()`。这些函数允许我们在程序运行时动态地分配和释放内存,极大地提高了代码的灵活性。`malloc()`用于...

    内存池(C语言实现)

    在C语言中,由于标准库中的`malloc`和`free`函数在频繁分配和释放小块内存时会产生较多开销,内存池通过预分配一大块连续内存,并在此基础上进行细粒度的分配和回收,从而减少了系统调用的次数,提高了程序运行速度...

    malloc 与new的区别

    new操作符如果在分配内存失败时,会抛出一个bad_alloc异常,这有助于在运行时捕捉内存分配错误;而malloc在分配失败时则返回NULL,这需要程序员在使用前自行检查。 最后,关于内存泄漏的检测。尽管malloc和free以及...

    c语言函数大全.pdf

    根据给定的文件信息,以下是对...以上函数涵盖了C语言中常见的内存管理操作以及部分系统调用功能,是编程中处理动态内存分配、释放及系统交互的基础。理解和熟练掌握这些函数对于编写高效、安全的C语言程序至关重要。

    new 和 malloc区别.docx

    ### 新与malloc的区别详解 #### 一、概述 在C++编程中,动态内存管理...相比之下,`malloc`则更适合于简单的内存分配任务,尤其是在C语言环境中更为常见。开发者应根据具体的应用场景和需求选择合适的内存分配方式。

    alloc_h.rar

    "alloc_h.rar"的标题暗示了我们可能正在处理一个与内存分配相关的头文件,这通常包含函数声明和宏定义,用于在程序运行时请求、释放或管理内存。在C和C++中,内存分配分为静态分配、栈分配和堆分配三种主要类型。 1...

    C语言程序设计(第2版)-2期 拓展知识8-3 动态存储分配函数.pdf

    动态内存分配提供了灵活的内存管理,使得程序可以根据运行时的需要调整内存使用。然而,也需要注意内存泄漏的问题,即当不再需要某块内存时忘记释放它。这可能导致程序占用过多内存,甚至崩溃。因此,良好的编程习惯...

Global site tag (gtag.js) - Google Analytics