动态内存管理: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


相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
30天前
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
1月前
|
存储 程序员 编译器
C语言——动态内存管理与内存操作函数
C语言——动态内存管理与内存操作函数
|
1月前
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
165 1
|
1月前
|
程序员 C语言
C语言内存函数精讲
C语言内存函数精讲
|
25天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
21 0
|
1月前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
40 0
|
1月前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
66 0
|
1月前
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
一刻也没有为它哀悼~接下来登场的是动态内存分配的malloc与realloc以及free函数
67 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
376 0