Menu
×
   ❮   
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 字节分配在地址 %p \n", size, ptr1);

// 将内存大小调整为可容纳六个整数
size = 6 * sizeof(*ptr1);
ptr2 = realloc(ptr1, size);

printf("%d 字节重新分配在地址 %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("成功。8 字节重新分配在地址 %p \n", ptr2);
  ptr1 = ptr2;  // 更新 ptr1 以指向新分配的内存
}
自己试试 »

注意:在分配内存时,您应该始终包括错误检查(如果pointer == NULL)。

注意:您还应该始终释放或释放分配的内存,当您完成使用它时。这对于确保您的程序按预期运行非常重要,但它还会使程序更易于维护和更高效。

要释放内存,只需使用 free() 函数

示例

释放分配的内存

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

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



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.