C语言静态内存分配(如数组声明)有固定大小,面对数据量不定、程序运行按需变化场景,动态内存分配“闪亮登场”,宛如“魔法空间”,依程序需求灵活调配、掌控内存资源。
核心函数是malloc
、calloc
、realloc
与free
,各司其职、协同“作战”。malloc
函数在<stdlib.h>
头文件里“安家”,语法void *malloc(size_t size);
,按传入字节数在堆区开辟内存,返回指向首字节的指针,需强转对应类型使用,如int *p = (int *)malloc(5 * sizeof(int));
为 5 个int
型数据“抢地盘”,若内存不足则返回NULL
,使用前务必检查,防后续操作“踩空”。
calloc
函数稍“贴心”,void *calloc(size_t num, size_t size);
不仅开辟内存,还将空间初始化为 0,int *q = (int *)calloc(3, sizeof(int));
让新内存“干干净净”,适合数组类初始清零需求,同样失败返NULL
。
realloc
函数负责“改造扩容”,void *realloc(void *ptr, size_t size);
调整已分配内存块大小,ptr
是原指针,size
新尺寸,若扩大空间,可能另觅新址拷贝旧数据再拓展;缩小则原地或重分配后返回部分内存指针,像p = (int *)realloc(p, 10 * sizeof(int));
为p
指向数组“扩编”,使用不当(如传NULL
当ptr
或操作野指针)会“闯祸”。
有“分配”必有“释放”,free
函数“收工扫尾”,void free(void *ptr);
释放malloc
等开辟内存,参数是对应指针,free(p);
后内存归还给系统再利用,注意只能释放堆区内存且释放后指针置NULL
,避免成悬空指针“惹麻烦”。
实际应用里,动态内存分配大显身手。实现动态数组,依用户输入元素个数灵活开辟空间,实时扩容缩容;构建链表,节点按需生成、链接、删除,管理不定长数据序列;处理图像、文本大数据块,精准分配、高效释放,优化系统性能。可一旦“疏忽”,内存泄漏、悬空指针、越界读写等“暗礁”频现,严谨编码、规范使用、勤查错误,才能驾驭动态内存分配“航船”,在C语言编程“海洋”破浪前行。