C 语言内存管理(malloc、calloc、realloc、free)

本文深入解析内存管理核心概念,涵盖堆与栈的区别、动态内存分配原理及常见函数如malloc、calloc、realloc和free的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、内存

1.1 内存组织方式

开发人员将程序编写完成之后,程序要先装载到计算机的内核或者半导体内存中,再运行程序。程序被组织成4个逻辑段:

  • 可执行代码
  • 静态数据
    可执行代码和静态数据存储在固定的内存位置
  • 动态数据(堆)
    程序请求动态分配的内存来自内存池,也就是上面所列举的堆。

  • 局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中

二、堆与栈

通过内存组织方式可以得知,堆用来存放动态分配存储空间,而栈用来存放局部数据对象、函数的参数以及调用函数和被调用函数的联系。

2.1 堆

在内存的全局存储空间当中,用于程序动态分配和释放的内存块称为自由存储空间,通常也称之为堆。
在c语言中,是用malloc函数和free函数来从堆中动态分配和释放存储。

2.2 栈

程序不会处理堆那样在栈中显示地分配内存。当程序调用函数和声明局部变量时,系统将自动分配内存。
栈是一个后进先出的压入弹出式的数据结构。


三、动态管理

3.1 malloc函数(stdlib.h)

在内存中动态地分配一块size字节的内存空间。
malloc函数会返回一个指针,该指针指向分配的内存空间,如果出现错误则返回NILL
void *malloc(unsigned int size) 
3.2 calloc函数(stdlib.h)
在内存中动态分配n个长度为size字节的连续内存空间数组。
calloc函数会返回一个指针,该指针指向动态分配的连续内存空间地址。当分配空间错误时,返回NULLvoid *calloc(unsigned n, unsigned size) 

3.3 realloc函数(stdlib.h)

改变ptr指针指向的空间大小为size字节。设定的size字节可以是任意的,也就是说既可以比原来的数值大,也可以比原来的数值小。
返回值是一个指向新地址的指针,如果出现错误则返回NULLvoid *realloc(void *ptr, size_t size);

3.4 free函数(stdlib.h)

使用指针ptr指向的内存区,使部分内存区能被其他变量使用。ptr是最近一次调用calloc或malloc函数时返回的值。
void free(void *ptr) 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书香水墨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值