C 教程

C 教程 C 语言简介 C 下载安装和环境配置 C 快速入门 C 语法 C 输出 C 注释 C 变量 C 数据类型 C 常量 C 运算符 C 布尔值 C If...Else 语句 C Switch 语句 C While 循环 C For 循环 C Break/Continue 语句 C 数组 C 字符串 C 用户输入 C 内存地址 C 指针

C 函数

C 函数 C 函数参数 C 作用域 C 函数声明 C 递归 C 数学函数

C 文件

C 创建文件 C 写入文件 C 读取文件

C 结构体

C 结构体 C 嵌套结构体 C 结构体和指针 C 联合体 C typedef

C 枚举

C 枚举

C 内存

C 内存管理

C 错误

C 错误 C 调试 C 空值 C 错误处理 C 输入验证

C 更多

C 日期 C 随机数 C 宏 C 代码组织 C 存储类 C 位运算符 C 固定宽度整数

C 项目

C 项目

C 参考资料

C 参考资料 C 关键词 C <stdio.h> C <stdlib.h> C <string.h> C <math.h> C <ctype.h> C <time.h>

C 标准库参考

C 标准库 - 参考手册 C 标准库 - <assert.h> C 标准库 - <ctype.h> C 标准库 - <errno.h> C 标准库 - <float.h> C 标准库 - <limits.h> C 标准库 - <locale.h> C 标准库 - <math.h> C 标准库 - <setjmp.h> C 标准库 - <signal.h> C 标准库 - <stdarg.h> C 标准库 - <stddef.h> C 标准库 - <stdio.h> C 标准库 - <stdlib.h> C 标准库 - <string.h> C 标准库 - <time.h>

C 实例

C 语言实例 C 经典100例 C 编译器 C 测验


C 重新分配内存

重新分配内存

如果您预留的内存量不足,您可以重新分配来增加内存容量。

重新分配会在保留原有数据的情况下,预留不同(通常更大)的内存量。

您可以使用realloc()函数更改已分配内存的大小。

realloc() 函数接受两个参数:

int *ptr2 = realloc(ptr1, size);
  • 第一个参数是指向要调整大小的内存的指针。
  • 第二个参数指定已分配内存的新大小,以字节为单位。

realloc() 函数尝试调整 ptr1 处的内存大小,并返回相同的内存地址。如果无法调整当前地址的内存大小,则会在不同的地址分配内存并返回新地址。

注意:当realloc()返回不同的内存地址时,原地址处的内存不再被保留,使用起来不安全。重新分配内存时,最好将新指针赋值给之前的变量,以免意外使用旧指针。

示例

增加已分配内存的大小:

int *ptr1, *ptr2, size;

// 为四个整数分配内存
size = 4 * sizeof(*ptr1);
ptr1 = malloc(size);

printf("%d bytes allocated at address %p ", size, ptr1);

// 调整内存大小以容纳六个整数。
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);

printf("%d bytes reallocated at address %p ", size, ptr2);
亲自试一试 »

空指针和错误检查

如果无法分配更多内存,realloc() 函数将返回一个 NULL 指针。这种情况发生的可能性很小,但当你需要代码万无一失时,就值得记住这一点。

以下示例通过检查 NULL 指针来判断 realloc() 是否能够调整内存大小:

示例

检查空指针:

int *ptr1, *ptr2;

// 分配内存
ptr1 = malloc(4);

// 尝试调整内存大小
ptr2 = realloc(ptr1, 8);

// 检查 realloc 是否能够调整内存大小
if (ptr2 == NULL) {
  // 如果重新分配失败
  printf("Failed. Unable to resize memory");
} else {
  // 如果分配成功
  printf("Success. 8 bytes reallocated at address %p ", ptr2);
  ptr1 = ptr2;  // 更新 ptr1 以指向新分配的内存
}
亲自试一试 »

注意:分配内存时,务必包含错误检查(如果pointer == NULL)。

注意:使用完毕后,务必释放已分配的内存。这不仅能确保程序按预期运行,还能提高程序的可维护性和效率。

要释放内存,只需使用free()函数:

示例

已分配内存:

// 已分配内存
free(ptr1);
亲自试一试 »

下一章您将学习如何释放已分配的内存以及为什么这很重要。