搜索
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);
运行实例 »

点击 "运行实例" 按钮查看在线实例

在下一章中,你将学习更多关于如何释放已分配内存以及为什么这很重要的内容。