realloc

目录

前提须知:

函数介绍:

函数原型:

使用realloc:

 realloc在调整内存空间的是存在两种情况/使用realloc为扩大空间的两种情况

1.是剩下的没有被分配的空间足够 

2 .剩下没有被分配的空间不够了

注意事项:

realloc和malloc的等价关系:



realloc_第1张图片

前提须知:

http://t.csdn.cn/bw07Oicon-default.png?t=N7T8http://t.csdn.cn/bw07O

函数介绍:

  • realloc函数的出现让动态内存管理更加灵活。
  • 有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时 候内存,我们⼀定会对内存的⼤⼩做灵活的调整。
  • realloc 函数就可以做到对动态开辟内存大小的调整。

函数原型:

 void* realloc (void* ptr, size_t size);
  • ptr 是要调整的内存地址
  • size 调整之后新大小
  • 返回值为调整之后的内存起始位置。 

使用realloc:

realloc_第2张图片

  • 如上图所示,使用realloc将申请的空间进行调整。
  • p是所需要调整的空间的指针,指向需要调整的空间的起始位置。
  • 40是需要调整成为的大小,也就是将原来申请的空间调整成40个字节的大小。 


 realloc在调整内存空间的是存在两种情况/使用realloc为扩大空间的两种情况

1.是剩下的没有被分配的空间足够 

realloc_第3张图片

如图所示,尚未分配的空间足够应对realloc扩大空间的调整,并不会因为内存空间不够而产生一系列的问题。

也因为剩下的没有被分配的空间足够应付扩张,所以再进行realloc调整内存后,返回的地址还是当前这个地址。

2 .剩下没有被分配的空间不够了

realloc_第4张图片

如图所示,尚未分配的空间不足以因对realloc进行扩大空间的调整。

也因此我们需要将之前存储的数据进行转移,转移到一个连续的、经历realloc调整后、内存足够的空间中,也因为数据的转移,所以后面返回的是新空间的地址。 

realloc_第5张图片

注意事项:

1.当增加的内存空间过大时,可能会导致扩容失败,而扩容失败会返回空指针。

也因为会返回空指针,而导致以下代码会出现错误:

p = realloc(p,40);

p是原先旧空间的指针,内部存放的是旧空间的地址,而这一步返回指针地址也会导致原先的旧指针内的地址被NULL覆盖变成空指针 。

正确做法:

int*ptr = (int*)realloc(p,40);
if (ptr != NULL)
{
  p = ptr;
}
else
{
  perror("realloc");
  return 1;
}

 所以为了防止这一步的扩容失败,我们得从新换一个指针变量进行赋予扩容后的指针地址,并且进行判断是否扩容失败

 2.realloc的调整情况是情况2的时候,旧的空间会被realloc释放

3.在注意事项1中的背景下,我们得到,不能直接free(ptr)因为ptr的指向是新的空间,使用free后这个新的空间会被释放。

正确:
if (ptr != NULL)
{
  p = ptr;
  ptr = NULL;
}


错误:
if (ptr != NULL)
{
  p = ptr;
  free(ptr)
}

realloc_第6张图片

realloc和malloc的等价关系:

当reaLLoc函数的第一个参数是NULL指针的时候,功能类似于malloc函数。

int*p = (int*)realloc(NULL,40);/int *p = (int*)malloc(10 * sizeof(int));


realloc(NULL,40);/malloc(10 * sizeof(int));

你可能感兴趣的:(数据存储,C语言,c语言,数据结构,算法,函数,数据存储)