动态内存分配 | C语言中的内存管理
内容提要
动态内存分配是在运行时更改数据结构大小的一种方式。静态内存分配发生在堆栈中,动态内存分配发生在堆中。动态内存分配的函数有malloc、calloc、realloc和free。malloc用于分配内存,calloc用于分配并初始化内存,realloc用于重新分配内存,free用于释放内存。
延伸解读
堆与栈:动态内存的物理基础
文章指出,程序内存通常分为代码、静态/全局变量、栈和堆四个段。静态分配发生在栈上,而动态分配发生在堆上。栈内存由编译器自动管理,大小固定;堆内存则由程序员手动申请和释放,容量更大但管理不当易导致泄漏或碎片。理解这一区别有助于在需要运行时可变大小或大块内存时,正确选择动态分配。
malloc 与 calloc 的关键差异
malloc 只分配指定字节数的内存,不初始化,因此分配到的内存中可能是垃圾值;calloc 则分配 n 个连续块,并将每个字节初始化为 0。两者都返回 void* 指针,需要强制转换为合适类型,且内存不足时均返回 NULL。若程序依赖初始值为 0,应使用 calloc;若追求效率且会立即覆盖内存,malloc 更合适。
realloc 与 free 的使用要点
realloc 用于调整已分配内存的大小,它接受原指针和新的大小,可能返回新地址。若调整失败,原内存保持不变,因此不应直接用原指针接收返回值,以免丢失原地址。free 用于释放不再需要的堆内存,释放后指针应置为 NULL,避免悬空指针。动态内存必须成对管理,否则会造成内存泄漏。
Q&A
动态内存分配的定义是什么?
动态内存分配是在运行时更改数据结构大小的一种方式。
动态内存分配和静态内存分配有什么区别?
静态内存分配发生在堆栈中,而动态内存分配发生在堆中。
C语言中有哪些函数用于动态内存分配?
动态内存分配的函数包括malloc、calloc、realloc和free。
malloc函数的作用是什么?
malloc用于分配内存,并返回一个指向分配空间的空指针。
calloc函数与malloc函数有什么不同?
calloc用于连续分配内存,并将每个块初始化为0,而malloc不初始化内存。
如何释放动态分配的内存?
使用free函数可以释放不再需要的动态分配内存。