老是搞不清楚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)。
参数说明:
- numElements是要分配的元素的数量。
- 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() 动态分配的内存块地址。
注意:
- 分配的内存块一旦释放,就不应该再次操作已经释放的地址,也不应该再次使用 free() 对该地址释放第二次。
- 如果忘记调用free()函数,会导致无法访问未回收的内存块,构成内存泄漏。
内存分配的基本原则
- 避免分配大量的小内存块。分配堆上的内存有一些系统开销,所以分配许多小的内存块比分配几个大内存块的系统开销大。
- 仅在需要时分配内存。只要使用完堆上的内存块,就需要及时释放它,否则可能出现内存泄漏。
- 总是确保释放已分配的内存。在编写分配内存的代码时,就要确定好在代码的什么地方释放内存。
以上就是动态内存分配的相关内容了,欢迎大家补充讨论。