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 \n", size, ptr1); // 调整内存大小以容纳六个整数 size = 6 * sizeof(*ptr1); ptr2 = realloc(ptr1, size); printf("%d bytes reallocated at address %p \n", size, ptr2);运行实例 »
点击 "运行实例" 按钮查看在线实例
空指针与错误检查
如果 realloc()
函数无法分配更多内存,它将返回一个空指针。这种情况虽然不太可能发生,但在需要编写防故障代码时,值得注意。
下例通过检查空指针来验证 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 \n", ptr2); ptr1 = ptr2; // 更新 ptr1 以指向新分配的内存 }运行实例 »
点击 "运行实例" 按钮查看在线实例
注意:在分配内存时,你应该始终包括错误检查(即检查指针是否为 NULL)。
注意:当你不再需要使用已分配的内存时,也应该始终释放它。这对于确保程序按预期运行至关重要,同时也有助于提高程序的可维护性和效率。
要释放内存,只需使用 free()
函数:
实例
释放已分配的内存:
// 释放已分配的内存 free(ptr1);运行实例 »
点击 "运行实例" 按钮查看在线实例
在下一章中,你将学习更多关于如何释放已分配内存以及为什么这很重要的内容。