动态内存管理 | 您所在的位置:网站首页 › 动态内存管理的作用是响应 › 动态内存管理 |
目录 一. 前言 二. 动态内存的介绍 1. 动态内存的作用 2. 应用栈去申请内存空间的缺点 三. 动态内存函数 1. malloc函数 语法结构 代码实例 2. free函数 语法结构 代码实例 流程图 编辑 内存泄露的情况 3. calloc函数 语法结构 代码实例 输出结果 4. realloc函数 语法结构 编辑 代码实例 四. 常见的动态内存分配错误 1. p的地址发生改变后再释放 2. 临时拷贝的释放 一. 前言我们已经掌握的内存开辟方式有: int val = 20;//在栈空间上开辟四个字节 char arr[10] = {0};//在栈空间上开辟10个字节的连续空间但是上述的开辟空间的方式有两个特点: 1. 空间开辟大小是固定的。2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道, 那数组的编译时开辟空间的方式就不能满足了。 这时候就只能试试动态存开辟了。 二. 动态内存的介绍动态内存分配(Dynamic Memory Allocation) 就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。 在声明数组前必须要指定数组的元素个数,即数组空间大小在声明时已经确定了,但是需要存放的元素往往要在运行之后才能准确知道。比如说我已经把一张纸写满好了周一到周五要干的事情,但是突然发现周六周日也有想干的事情。这个时候就需要动态的扩大规划了 2. 应用栈去申请内存空间的缺点 当输入的元素大于声明的元素时,会造成错误当输入的元素小于声明的元素时,会造成内存的浪费数组的大小不能动态调整 三. 动态内存函数 1. malloc函数头文件#include 语法结构 void* malloc (size_t size); //size_t:表示无符号类型 //size:表示申请分配的内存大小,单位为字节malloc 是C语言提供的一个动态内存开辟的函数,该函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。具体情况如下: 如果开辟成功,则返回一个指向开辟好空间的指针。如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定。如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。 代码实例 // 这个*是乘的意思 int * ptd = (int *) malloc (30 * sizeof(int)); if (ptd == NULL) //空间申请失败则退出 { printf("%s\n", strerror(errno));//打印报错信息 return 1; } 2. free函数头文件#include 语法结构 void free (void* ptr); //ptr : 指向先前用malloc、calloc或realloc分配的内存块的指针在开辟空间(即malloc、calloc、realloc函数申请的空间)之后,当代码运行完全后,需要把这些开辟的空间给释放和回收 如果参数 ptr 指向的空间不是动态开辟的,那么 free 函数的行为是未定义的。如果参数 ptr 是 NULL 指针,那么 free 将不会执行任何动作。使用完之后一定要记得使用 free 函数释放所开辟的内存空间。使用指针指向动态开辟的内存,使用完并 free 之后一定要记得将其置为空指针,防止越界访问。原因:free()函数只会释放ptr指向空间的值,但ptr本身不会被置空。 代码实例 int main() { int*p = (int*)calloc(10, sizeof(int)); if (p == NULL) { printf("%s\n", strerror(errno));//打印报错信息 return 1; } //打印 int i = 0; for (i = 0; i < 10; i++) { printf("%d ", *(p + i)); } //释放 free(p);//释放 p = NULL;//将p置为空指针 return 0; } 流程图![]() |
CopyRight 2018-2019 实验室设备网 版权所有 |