【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

您所在的位置:网站首页 c程序的内存分布是什么 【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

2024-03-21 22:07| 来源: 网络整理| 查看: 265

请添加图片描述

文章目录 📝前言🌠 为什么要有动态内存分配?🌉malloc🌠free🌉calloc🌠 realloc🚩总结

📝前言

本小节,我们学习动态内存管理:为什么要有动态内存分配?4个动态内存开辟函数:malloc,free,calloc和realloc,这些C标准库中的内存管理函数都声明在在 stdlib.h 头⽂件中。干货满满!学习起来吧😃!

🌠 为什么要有动态内存分配?

程序运行时不确定需要多少内存空间。在编译期无法确定程序运行期间需要分配多大的内存块。这就需要在运行时动态申请和释放内存。 我们已经学习内存开辟方式有:

# define _CRT_SECURE_NO_WARNINGS 1 #include int main() { int n = 0;//在栈空间给变量开辟4个字节 char ch = 'a';//在栈空间给变量开辟1个字节空间 //数组 int arr[10] = {0};//在栈空间开辟10个字节的连续空间 return 0; }

但是这两种开辟的空间的方式具有局限性:

空间开辟⼤⼩是固定的。数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整,如数组里的arr[10]的10不能随时更改。

这是内存大致分类图:

在这里插入图片描述

但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。接下来,我们学习怎么一步一步分配空间吧!

🌉malloc

malloc函数是动态内存分配的基础函数(从堆内存中动态分配指定大小的内存块,并返回指向内存块的指针)。 函数原型:

void *malloc(size_t size); size_t size - 要分配的内存块大小,单位是字节。

分析函数原型例子:

int main() { //int arr[10]// p = malloc(40); return 0; }

为什么要用void * 接收类型?malloc分配40个字节空间,p存放的是分配空间的首地址,malloc只知道申请多大的空间,但是不知道会放什么类型数据,所以malloc函数就只能返回void*,当使用void*时,也就是void* p = malloc(40),但是void*指针是不能++--的解引用操作,可是我们在分配空间时,作为程序员,你想用什么类型,就分配什么类型就可以了。 比如:

int main() { int* p = (int*)malloc(40); return 0; }

图解: 在这里插入图片描述 返回值:

如果分配成功,malloc返回指向内存块的void指针。 如果失败(如没有足够的可用内存),返回NULL。

使用malloc分配的内存需要使用free函数释放,否则会造成内存泄漏。

重点:

malloc分配的内存不会被初始化,内容是未定义的。 在这里插入图片描述 在这里插入图片描述

返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃⼰来决定。

如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。

一般使用步骤:

1. 调用malloc分配指定大小的内存 2. 检查返回值是否为NULL 3. 使用分配到的内存 4. 调用free释放内存

例子:

#include int main() { //int arr[10];// //1. 调用malloc分配指定大小的内存 int* p = (int*)malloc(10*sizeof(int)); if (p == NULL)//2. 检查返回值是否为NULL { perror("malloc");//打印错误信息 return 1; } // int i = 0; //使用 - 给数组赋值 for (i = 0; i


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3