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()函数:
下一章您将学习如何释放已分配的内存以及为什么这很重要。

