一、内存分配
对于内存的分配,主要采用的是标记法。
分配方法有两种,一种是静态分配,也就是在程序编译的时候,就完成了对内存的分配。例如当一个数组在声明时,指定长度之后,它所需要的内存在编译时就会被分配。
另一种方法是动态分配,动态分配是指程序在运行时为它分配内存。
分配内存的时候,对于已分配的内存,操作系统会给一个标记,未分配的内存,操作系统也会有一个标记,操作系统辨别内存是否可以使用就是通过标记判断,当内存释放的时候,就会修改标记。
二、动态分配
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语言提供了四个与动态内存分配相关的函数:`calloc()`、`malloc()`、`realloc()` 和 `free()`。这些函数都在 `<stdlib.h>` 头文件中定义。 1. `calloc()` 函数用于分配指定数量的元素,每个元素的大小为指定的字节...
在本主题中,我们将深入探讨内存动态分配与释放,特别是通过C语言来模拟这一过程。 内存动态分配允许程序在运行时根据需要请求内存,而不是在编译时固定分配。这种方式提高了内存利用率,因为程序可以只在需要时...
它提供了直接访问内存的机制,如`malloc`、`calloc`、`realloc`和`free`等函数,这些函数在C语言中用于动态内存分配和释放。 内存分配主要包括两种类型:静态内存分配和动态内存分配。静态内存分配在编译时完成,...
在探讨C语言内存分配时,首先需要了解内存的基本概念。在计算机系统中,内存可以大致分为几个不同的部分,包括栈(stack)、堆(heap)、静态存储区(static/BSS段)和代码段等。栈用于存储局部变量和函数调用的上...
本项目专注于C语言中的动态内存分配,这在处理数据结构如链表、树或大型数组等时特别有用。在“动态内存分配C语言实现”中,我们将探讨以下几个关键知识点: 1. **malloc() 函数**:这是C语言中用于动态分配内存的...
C语言内存分配问题详解 在C语言中,内存分配是一个非常重要的概念。正确地分配和释放内存对于程序的正确性和性能至关重要。本文将详细介绍C语言中的内存分配问题,包括内存的四个区、动态分配和释放内存、避免内存...
堆是通过动态分配函数(如`malloc`、`calloc`、`realloc`)来获取和释放的内存区域。程序员负责管理这部分内存,使用`malloc`分配的内存必须用`free`函数来释放。如果忘记释放,会导致内存泄漏,即已分配的内存无法...
动态分区分配是一种内存管理技术,它允许系统根据程序的需要动态地分配和释放内存空间。这种方法与固定分区分配相对,后者在系统启动时预先划分固定大小的区域,无法灵活适应不同大小的进程需求。动态分区分配的主要...
本篇文章将深入探讨C语言的内存分配,特别是动态内存分配,以及与之相关的堆内存分配。 动态内存分配在程序执行期间提供了一种灵活的方式来创建和销毁变量或对象。在传统的编程模型中,变量和对象的内存由编译器在...
6. **内存泄漏检测**:为了找出程序中的内存泄漏,可以使用特定的工具如Valgrind,或者编写特定的代码片段来检查内存分配和释放的平衡。 7. **内存安全**:避免数组越界、双重释放等问题,防止缓冲区溢出等安全隐患...
3. **堆分配(动态内存分配)**:与栈分配不同,堆分配是在程序运行时通过特定函数手动申请的。常用的内存分配函数包括`malloc()`、`calloc()`、`realloc()`和`free()`。堆分配允许程序根据需要动态地申请和释放内存...
与静态内存分配相比,动态内存分配更加灵活,可以根据实际情况调整内存使用量,避免内存浪费。 ##### 3.2 动态内存分配函数 C语言中常用的动态内存分配函数包括: - **malloc()**:分配指定大小的内存块。 - **...
在C语言中,动态内存分配是通过malloc函数实现的。malloc函数的原型为void *malloc(size_t n),其中n是要分配的内存的大小,返回值是分配内存的块的首地址。 例如,使用malloc函数分配一个可以容纳10个整型元素的...
C语言动态内存分配 C语言动态内存分配是指在程序运行时分配内存空间,以满足程序的需求。在某些情况下,程序需要在运行时动态地分配内存,以便存储大量数据或处理不确定大小的数据。例如,在顺序对一批文件进行解析...
动态内存分配是C语言编程中的一个重要概念,它允许程序在运行时根据需要请求和释放内存。这个压缩包包含了一系列相关的文件,包括源代码、设计报告和可能的演示材料,这将有助于我们深入理解动态内存分配器的设计与...
### C语言内存分配详解 #### 一、C语言的4G虚拟寻址空间概念 在C语言中,每个进程都有一个4GB的虚拟地址空间。这个空间被划分为不同的区域来存储不同类型的变量和数据。这里提到的4G指的是4GB(即4 * 1024 * 1024 ...
- 自动管理内存分配与释放,遵循先进后出(LIFO)原则。 - 生命周期由函数调用自动管理。 #### 三、示例程序分析 考虑以下C语言程序: ```c #include #include int global_var = 5; void func(int arg) { ...
### C语言内存管理:静态与动态分配的较量 #### C语言简介 C语言是一种通用的编程语言,由丹尼斯·里奇(Dennis Ritchie)在20世纪70年代早期于美国电话电报公司(AT&T)的贝尔实验室开发。C语言以其高效性、灵活...
需要注意的是,free函数同样是一个库函数,并且其参数必须是一个由动态内存分配方法分配的内存块的首地址。 五、动态分配内存特点 动态分配内存有以下几个特点: * 内存空间大小可以是一个变量,其值在运行时确定...