深耕C语言动态内存:realloc实战与数组求和综合练习
在C语言的学习旅程中,动态内存管理是绕不开的重要知识点,它让程序能够灵活应对不确定的内存需求。今天,我重点攻克了 realloc 函数的用法,并通过一个动态数组求和的综合习题,将 malloc 、 free 与 realloc 的知识点融会贯通,现将学习心得整理如下。
一、动态内存核心函数回顾
动态内存管理的核心是从堆区申请和释放空间,避免静态数组固定大小的局限性,常用函数包括:
- malloc :用于申请指定大小的动态内存,返回 void* 指针,需强制转换为对应类型;
- free :释放 malloc 、 realloc 申请的动态内存,避免内存泄漏;
- realloc :调整已申请动态内存的大小,可实现扩容或缩容,是本次学习的重点。
二、realloc函数:动态内存的“伸缩术”
1. 函数原型与作用
void* realloc(void* ptr, size_t size) ,其中 ptr 是原动态内存指针, size 是调整后的内存大小(字节数)。其核心作用是在原有内存基础上调整空间,若原内存后有足够连续空间,直接扩容;若没有,则重新申请新空间,复制原数据后释放旧空间。
2. 关键注意事项
- 必须用临时指针接收 realloc 的返回值,避免扩容失败(返回 NULL )时覆盖原指针,导致数据丢失;
- 若 ptr 为 NULL , realloc 等价于 malloc ;若 size 为0,等价于 free 。
3. 实操示例
以下代码实现了“申请5个int空间→赋值→扩容为10个int空间→输出”的流程:
int n = 5;
int* p = (int*)malloc(n * sizeof(int));
assert(p != NULL); // 断言检查内存申请是否成功
// 给初始内存赋值1-5
for (int i = 0; i < n; i++) {
*(p + i) = i + 1;
}
// 扩容为原来的2倍(10个int)
int* ptr = NULL;
ptr = realloc(p, n * sizeof(int) * 2);
if (ptr != NULL) { // 确认扩容成功后更新原指针
p = ptr;
// 输出扩容后的所有元素(前5个为原数据,后5个为随机值)
for (int i = 0; i < 2 * n; i++) {
printf("%d ", *(p + i));
}
}
free(p); // 释放内存
p = NULL; // 避免野指针

三、综合习题:动态数组求和
1. 题目需求

2. 完整代码
#include<stdlib.h>
#include<assert.h>
#include<stdio.h>
int main()
{
int n = 0;
printf("请输入数组大小n\n");
scanf_s("%d", &n);
// 申请n个int大小的动态内存
int* p = (int*)malloc(n * sizeof(int));
assert(p != NULL); // 断言检查,失败则终止程序
if (p == NULL) { // 冗余检查,增强程序健壮性
printf("分配内存失败\n");
return -1;
}
// 接收用户输入的n个整数
printf("请输入n个整数\n");
for (int i = 0; i < n; i++) {
scanf_s("%d", &p[i]);
}
// 计算数组总和
int sum = 0;
for (int i = 0; i < n; i++) {
sum += *(p + i); // 等价于sum += p[i]
}
printf("该数组的和为 %d\n", sum);
// 释放内存并置空指针
free(p);
p = NULL;
return 0;
}
图例: 
3. 核心知识点应用
- 用 malloc 根据用户输入的 n 动态申请数组空间,突破静态数组的大小限制;
- 双重检查内存申请结果( assert + if ),确保程序稳定性;
- 用 free 释放内存并将指针置空,彻底避免内存泄漏和野指针问题。
四、今日学习总结
1. realloc 的核心是“灵活调整内存大小”,务必用临时指针接收返回值,这是避免bug的关键;
2. 动态内存管理的“黄金法则”:申请必检查、扩容慎直接、用完必释放、释放后置空;
3. 综合习题让我深刻体会到,动态内存的价值在于“按需分配”,尤其适用于用户输入不确定的场景。
动态内存管理看似复杂,但只要掌握核心函数的用法和注意事项,就能让程序更灵活、高效。后续还需多做实操练习,熟练应对各种场景下的内存管理问题。
