菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

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() 函数

示例

释放已分配的内存

// 释放已分配的内存
free(ptr1);
自己动手试一试 »

您将在下一章中了解更多关于如何释放已分配内存以及为什么这很重要的信息。



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持