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()
函数无法分配更多内存,它将返回一个 NULL
指针。这种情况极不可能发生,但当您的代码需要万无一失时,值得牢记。
以下示例通过检查 NULL
指针来检查 realloc()
是否能够调整内存大小
示例
检查空指针
int *ptr1, *ptr2;
// 分配内存
ptr1 = malloc(4);
// 尝试调整内存大小
ptr2 = realloc(ptr1, 8);
// 检查 realloc 是否能够调整内存大小
if (ptr2 == NULL) {
// 如果重新分配失败
printf("失败。无法调整内存大小");
} else {
// 如果重新分配成功
printf("成功。在地址 %p 处重新分配了 8 字节 \n", ptr2);
ptr1 = ptr2; // 将 ptr1 更新为指向新分配的内存
}
自己动手试一试 »
注意:在分配内存时,应始终包含错误检查(如果 *指针* == NULL)。
注意:使用完已分配的内存后,应始终**释放**或释放它。这对于确保您的程序按预期运行很重要,但它也会使其更易于维护和高效。
要释放内存,只需使用 free()
函数
您将在下一章中了解更多关于如何释放已分配内存以及为什么这很重要的信息。