C++ Reference: Standard C++ Library reference: C Library: cstdlib: realloc

C++官网参考链接:https://cplusplus.com/reference/cstdlib/realloc/

函数 
<cstdlib>
realloc
void* realloc (void* ptr, size_t size);
重新分配内存块
更改ptr所指向的内存块的大小。
函数可能将内存块移动到一个新的位置(其地址由函数返回)。
即使块被移动到一个新的位置,内存块的内容仍然保留到新和旧大小中较小的内存块中。如果新的size更大,则新分配的部分的值是不确定的。
如果ptr是空指针,该函数的行为类似于malloc,分配一个size个字节的新块,并返回指向其开始的指针。
C90(C++98)
否则,如果size为0,则释放之前在ptr分配的内存,就像调用了free一样,并返回空指针。
C99/C11(C++11)
如果size为0,则返回值取决于特定的库实现:它可能是空指针,也可能是不应该解引用的其他位置。
如果函数分配请求的内存块失败,将返回一个空指针,并且实参ptr所指向的内存块不会被释放(它仍然有效,且其内容不变)。

形参
ptr
指向先前用malloccallocrealloc分配的内存块的指针。
或者,它可以是一个空指针,在这种情况下分配一个新的块(就像调用malloc一样)。
size 
内存块的新大小,以字节为单位。
size_t是无符号整型。

返回值
一个指向重新分配的内存块的指针,它可以是与ptr相同的,也可以是一个新的位置。
此指针的类型为void*,可以将其强制转换为所需的数据指针类型,以便可解引用。
C90(C++98)
空指针表示size为0(因此ptr被释放),或者函数没有分配存储空间(因此ptr指向的块没有被修改)。
C99/C11(C++11)
空指针表示函数分配存储失败,因此ptr指向的块没有被修改。

用例
/* realloc example: rememb-o-matic */
#include <stdio.h>      /* printf, scanf, puts */
#include <stdlib.h>     /* realloc, free, exit, NULL */

int main ()
{
  int input,n;
  int count = 0;
  int* numbers = NULL;
  int* more_numbers = NULL;

  do {
     printf ("Enter an integer value (0 to end): ");
     scanf ("%d", &input);
     count++;

     more_numbers = (int*) realloc (numbers, count * sizeof(int));

     if (more_numbers!=NULL) {
       numbers=more_numbers;
       numbers[count-1]=input;
     }
     else {
       free (numbers);
       puts ("Error (re)allocating memory");
       exit (1);
     }
  } while (input!=0);

  printf ("Numbers entered: ");
  for (n=0;n<count;n++) printf ("%d ",numbers[n]);
  free (numbers);

  return 0;

程序提示用户输入数字,直到输入0字符为止。每次引入一个新值时,由数字指向的内存块的大小就增加一个int的大小。

数据竞争
只有ptr和返回指针引用的存储才会被修改。调用不会访问其他存储位置。
如果函数释放或重用由另一个分配或释放函数重用或释放的存储单元,则函数以这样的方式同步,即释放完全在下一次分配之前发生。

异常(C++) 
无抛出保证:此函数从不抛出异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_40186813

你的能量无可限量。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值