C语言的程序内存分配

老是搞不清楚C语言中的内存分配?今天一文就带你了解所有内存的方式

首先先来看一张图:

动态内存分配指根据需要向系统申请所需大小的空间,由于未在声明部分定义其为变量或者数组,不能通过变量名或者数组名来引用这些数据,只能通过指针来引用)

内存分配相关函数

头文件 <stdlib.h> 声明了四个关于内存动态分配的函数:

1.malloc() 函数

malloc() 函数用于分配一块连续的内存空间。

函数原型:

void *malloc(size_t size);

返回值说明:

如果内存分配成功,返回一个void指针,指向新分配内存块的地址;如果分配失败(例如内存不足),返回一个空指针(NULL)。

参数说明:size是要分配的内存块的大小,以字节为单位。

2.calloc() 函数

calloc() 函数用于分配内存并将其初始化为零,它在分配内存块时会自动将内存中的每个字节都设置为零。

函数原型:

void *calloc(size_t numElements, size_t sizeOfElement);

返回值说明:

如果内存分配成功,返回一个 void 指针,指向新分配内存块的地址;如果分配失败(例如内存不足),返回一个空指针(NULL)。

参数说明: 

  1. numElements是要分配的元素的数量。
  2. sizeOfElement是每个元素的大小(以字节为单位)。

3.realloc() 函数

realloc() 函数用于重新分配malloc() 或calloc() 函数所获得的内存块的大小。

函数原型:

void* realloc(void *ptr, size_t size);

返回值说明:

返回一个指向重新分配内存块的指针。如果内存重新分配成功,返回的指针可能与原始指针相同,也可能不同;如果内存分配失败,返回返回一个空指针(NULL)。

如果在原内存块上进行缩减,通常返回的原先的地址。

参数说明:ptr是要重新分配的内存块的指针。size是新的内存块的大小(以字节为单位)

4.free() 函数

在介绍这个函数之前我们先来了解内存泄漏的概念

内存泄漏(Memory Leak)是指程序在动态分配内存后,由于某些原因未能正确释放已分配的内存,导致这部分内存无法被程序继续使用或系统回收。虽然程序本身仍在运行,但这部分内存将一直被占用,直到程序结束或系统重启。这种问题在长期运行的程序中,尤其是嵌入式系统、服务器程序或资源受限的环境中,可能导致内存耗尽,从而引发程序崩溃或系统故障。

内存泄漏的产生原因

内存泄漏通常发生在使用动态内存分配(如 malloc()calloc() realloc())时,程序员未能在不再需要这块内存时使用 free() 函数来释放它。

如果动态分配的内存空间没有被正确释放,这种情况称为内存泄漏,内存泄漏会导致系统中的可用内存逐渐减少,直到耗尽系统可用的内存资源。

free() 函数用于释放动态分配的内存,以便将内存返回给操作系统,防止内存泄漏。

函数原型:

void free(void *ptr);

返回值说明:

没有有返回值。

参数说明:

ptr是指向要释放的内存块的指针,ptr必须是malloc() 或calloc() 动态分配的内存块地址。

注意: 

  1. 分配的内存块一旦释放,就不应该再次操作已经释放的地址,也不应该再次使用 free() 对该地址释放第二次。
  2. 如果忘记调用free()函数,会导致无法访问未回收的内存块,构成内存泄漏。

内存分配的基本原则 

  1. 避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大内存块的系统开销大。
  2. 仅在需要时分配内存。只要使用完堆上的内存块,就需要及时释放它,否则可能出现内存泄漏。
  3. 总是确保释放已分配的内存。在编写分配内存的代码时,就要确定好在代码的什么地方释放内存。

以上就是动态内存分配的相关内容了,欢迎大家补充讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值