首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >动态内存分配函数解析

动态内存分配函数解析

作者头像
用户11379153
发布于 2025-11-05 15:12:12
发布于 2025-11-05 15:12:12
3820
举报

内存区域主要分为栈区,堆区以及静态区。其中,栈区用于存储局部变量,堆区用于存储由动态内存开辟的变量,而静态区则用于存储静态变量以及全局变量。以下是关于四个动态内存分配函数——malloc,calloc,realloc,以及free的讲解。

首先我们来谈谈为何需要动态内存分配。例如,我们在定义一个数组时,必须首先定义其数组长度,如int a[10]等,但往往在很多情况下,我们真正需要的数组长度在程序运行时才能确定,那么先前定义的长度与空间就可能存在过大和过小的问题,因此,我们需要使用动态内存分配。

—.malloc和free函数讲解

在引用这四个函数时,我们首先需要标明所需要的头文件,#include<stdlib.h>。malloc函数使用格式如下:

void* malloc (size_t size);括号内为所需要开辟空间的字节大小。

这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。 如果开辟成功,则返回一个指向开辟好空间的指针。 如果开辟失败,则返回一个NULL指针,因此malloc的返回值一定要做检查。 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使用的时候使用者自己 来决定,并且需要记住在之前使用强制类型转换。 如果参数 size 为0,malloc的行为是标准是未定义的,取决于编译器。

在使用malloc函数开辟空间之后,我们还需要在使用结束时利用free函数来对开辟的空间进行释放。注意此处的内存销毁,并非字面意思的内存删除,而是相当于把这一块空间再次还给操作系统。free函数使用格式如下:

void free (void* ptr);括号内为所需要释放回收空间的指针变量名。

同时我们需要注意两点:

第一,如果我们释放的指针不是由动态分配的,则free函数的行为是未定义的

第二,如果释放的指针是NULL指针,那么free函数将不进行任何操作。

定义并初始化未知长度数组的两种方式

二.calloc函数讲解

我们首先来看calloc函数的运用格式:

void* calloc (size_t num, size_t size);

其功能为把num个大小为size的元素开辟一块空间,与malloc函数的区别在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全0。

例子如下:

三.核心——realloc函数

在函数使用过程中,我们常常会遇到诸如先前开辟的内存不太能满足后续使用的问题,那么如何在使用过程中改变先前所设置的空间大小,令内存可以动态分配呢,realloc函数就是核心。

realloc使用格式如下:

void* realloc (void* ptr, size_t size); ptr 是要调整的内存地址 size 调整之后新的空间字节大小 返回值为调整之后的内存起始位置。 这个函数调整原内存空间大小的基础上,还会将原来内存中的数据移动到 新 的空间。

realloc在调整内存空间时存在两种情况: 情况1:原有空间之后有足够大的空间用于调整

情况2:原有空间之后空间不足

当是情况1 的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发生变化。 当是情况2 的时候,原有空间之后没有足够多的空间时,扩展的方法是:在堆空间上另找一个合适大小 的连续空间来使用。这样函数返回的是一个新的内存地址。

四.常见使用错误

1.对null指针的解引用操作

2.对动态开辟空间的越界访问

3.对非动态开辟变量使用free释放

4.free函数仅释放了部分内存

5.对同一块内存多次释放

6.动态开辟内存忘记释放


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • —.malloc和free函数讲解
  • 二.calloc函数讲解
  • 三.核心——realloc函数
  • 四.常见使用错误
    • 1.对null指针的解引用操作
    • 2.对动态开辟空间的越界访问
    • 3.对非动态开辟变量使用free释放
    • 4.free函数仅释放了部分内存
    • 5.对同一块内存多次释放
    • 6.动态开辟内存忘记释放
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档