动态内存管理:realloc扩容(缩容)函数详解

简介: 动态内存管理:realloc扩容(缩容)函数详解

当一个空间在使用着,使用着,突然间发现,内存空间不足,这个时候,是重新更改代码呢??还是想要对原先的内存进行扩容呢??这个答案肯定是显而易见的:进行扩容!!当你面临着几千行的代码,怎可能会进行重新返回去写呢??


下面笔者就带领各位老铁,来欣赏一下:realloc函数的使用:


0a2653c851af460fa595bd959398a8f1.png


void* realloc (void* ptr, size_t size)

将ptr指向的那段空间,设置为:size个字节的大小!!


列如:


#include <stdio.h>
#include <stdlib.h>
int main()
{
  int* p = (int*)malloc(40);
  //扩容(增加空间)
  int* ptr = (int*)realloc(p, 80);
  if (ptr != NULL)
  {
  p = ptr;
  ptr = NULL;
  }
  //当realloc开辟失败的时候,返回NULL
  //释放
  free(p);
  p = NULL;
}


上述代码中:重新定义了 ptr(int* ptr = (int*)realloc(p, 80)  ) :原因为:原本p指向40个字节的起始位置,但是当realloc开辟失败的时候,返回NULL,则p指向那40个空间也会出现错误,则需要通过ptr来进行判断一下!!


对于realloc函数在使用的情况中,我们必须要知道的为:


1.realloc函数的出现让动态内存管理更加灵活!!


2.有时候我们发现申请的空间太小了,有时候我们又会觉得申请的空间过大了!那么为了合理的使用内存,我们一定会对内存大小做灵活的调整,那么realloc函数就可以做到对动态内存大小的调整!!


函数的原型为:


void* realloc (void* ptr, size_t size)

3.ptr是要调整内存的地址


4.size是调整之后的大小,单位为字节


5.返回值为:调整之后的起始位置!


6.这个函数,在调整原内存空间的基础上,还会将原来内存中的数据移动到新的空间!


7.realloc在调整内存空间是存在2中情况!!


情况1.原有空间之后有在足够大的空间:


2d65d23f6d4748949b924e4057485923.png

在这个情况的时候,要扩容内存,就直接在原有内存之后,追加空间,原来的数据不会发生改变!!


情况2:原有空间之后,没有足够大的空间!


6de278e6d6694ce5bb08e7e842b7e74b.png

在这个情况的时候,原有空间之后没有足够多的空间时,扩展的方法为:在堆空间上另找一共合适大小的连续空间来使用!这样的话,函数的返回值就是一个新的内存地址!!


由于上述的两种情况,realloc函数的使用,就需要注意一下了!!


简单写一个realloc函数的使用列子,供大家参考一下:


#include <stdio.h>
#include <stdlib.h>
int main()
{
  int* p = (int*)malloc(40);
  if (p == NULL)
  {
  printf("%s\n", strerror(errno));
  return 1;
  }
  //使用
  int i = 0;
  for (i = 0; i < 10; i++)
  {
  *(p + i) = i;
  }
  for (i = 0; i < 10; i++)
  {
  printf("%d ", *(p + i));
  }
  printf("\n");
  //增加空间
  int* ptr = (int*)realloc(p, 80);
  //当realloc开辟失败的时候,会返回NULL
  if (ptr != NULL)
  {
  p = ptr;
  ptr = NULL;
  }
  for (i = 10; i < 20; i++)
  {
  *(p + i) = i;
  }
  for (i = 10; i < 20; i++)
  {
  printf("%d ", *(p + i));
  }
  return 0;
}


代码的运行结果为:


12c3b7f3f8814309a195c64f051d4445.png


另外:在realloc函数在使用的时候,:realloc(NULL,40)相当于:malloc(40)


本文就大致到此结束,笔者想要表达的内容已经概述完毕,有疑惑的各位lao't


相关文章
|
9天前
|
存储 算法 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (一)
`memcpy()` 和 `memmove()` 是C语言中的两个内存操作函数。 `memcpy()` 函数用于从源内存区域复制指定数量的字节到目标内存区域。它不处理内存重叠的情况,如果源和目标区域有重叠,结果是未定义的。函数原型如下: ```c void *memcpy(void *dest, const void *src, size_t num); ```
27 6
TU^
|
11天前
|
C语言
C语言内存函数和字符串函数模拟实现
C语言内存函数和字符串函数模拟实现
TU^
24 0
|
5天前
|
存储 算法 C语言
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
C语言指针与二维数组在函数参数传递和动态内存管理中的应用
14 0
|
6天前
|
C语言
C语言(11)----内存函数
C语言(11)----内存函数
11 1
字符串和内存函数(下)
字符串和内存函数(下)
|
6天前
|
C++
字符串和内存函数(上)
字符串和内存函数(上)
|
6天前
|
存储 测试技术 C语言
C语言内存管理函数研究
C语言内存管理函数研究
15 0
|
7天前
|
C语言
C语言内存操作函数
C语言内存操作函数
13 1
|
9天前
|
存储 C语言
C库函数详解 - 内存操作函数:memcpy()、memmove()、memset()、memcmp() (二)
`memset()`是一个C语言库函数,用于将指定内存区域的字节设置为特定值。函数原型为`void *memset(void *ptr, int value, size_t num)`,参数分别为指向内存起始位置的指针、要设置的值和设置的字节数。`memcmp()`函数则用于比较两个内存区域,返回值表示比较结果,原型为`int memcmp(const void *ptr1, const void *ptr2, size_t num)`。它比较指定字节数的内存,并根据比较结果返回整数值。
25 4
|
10天前
|
存储 安全 编译器
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)
12 0
【C语言】动态内存管理 -- -- 深入了解malloc、calloc、realloc、free、柔性数组(万字深入了解)