34 -realloc()函数

1 函数原型

realloc():重新分配内存块,函数原型如下:

void* realloc (void* ptr, size_t size);

cstdlib库描述如下:

Reallocate memory block
1. Changes the size of the memory block pointed to by ptr.
2. The function may move the memory block to a new location (whose address is returned by the function).
3. The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. If the new size is larger, the value of the newly allocated portion is indeterminate.
4. In case that ptr is a null pointer, the function behaves like malloc, assigning a new block of size bytes and returning a pointer to its beginning.
5. C90 (C++98)C99/C11 (C++11) : Otherwise, if size is zero, the memory previously allocated at ptr is deallocated as if a call to free was made, and a null pointer is returned.
6. If the function fails to allocate the requested block of memory, a null pointer is returned, and the memory block pointed to by argument ptr is not deallocated (it is still valid, and with its contents unchanged).
  1. realloc()函数:
    (1)用于重新分配内存块的大小,主要用于扩展已分配的内存块;
    (2)重分配成功且原地扩展,realloc()函数返回与原始ptr相同的指针;在这种情况下,原始ptr仍然有效,它指向的是扩展后的新内存块;
    (3)重分配成功且异地扩展,realloc()函数会分配一个新的内存块,将原内存块的内容复制到新内存块中,然后释放原内存块,即free(ptr);此时,realloc()函数返回一个指向新内存块的指针,你必须更新你的指针,以便通过新指针访问新内存块;
    (4)如果重分配失败,realloc()函数返回NULL;此时,ptr指向的原内存块不会被自动释放,它仍然有效,其内容保持不变;
    (5)如果指针ptr是一个空指针NULL,那么realloc()函数的行为和malloc()函数一样,它会分配一个新的内存块,大小为size字节,并返回指向该内存块起始位置的指针;
  2. 注意事项
    (1)内存泄漏:当重分配失败时,原内存块不会被释放,如果你不再需要原内存块,必须手动释放它,防止内存泄漏;
    (2)指针更新:首先,将realloc()函数的返回值赋给一个临时指针;其次,判断临时指针是否为空指针NULL来确定重分配内存是否成功;最后,在确认重分配内存成功的情况下,将临时指针赋值给ptr;
    (3)新内存内容:新分配的内存(即超出原内存大小的部分)是未初始化的,值是不确定的。

2 参数

realloc()函数有两个参数ptr和size:

  1. 参数ptr是一个指向原内存块的指针,类型为void*;
  2. 参数size是新内存块的大小,类型为size_t。

cstdlib库描述如下:

ptr
1. Pointer to a memory block previously allocated with malloc, calloc or realloc.
2. Alternatively, this can be a null pointer, in which case a new block is allocated (as if malloc was called).

size
1. New size for the memory block, in bytes.
2. size_t is an unsigned integral type.

3 返回值

realloc()函数的返回值类型为void*型:

  1. 分配成功,返回指向重新分配的内存块的指针;
  2. 分配失败,返回NULL。

cstdlib库描述如下:

1. A pointer to the reallocated memory block, which may be either the same as ptr or a new location.
2. The type of this pointer is void*, which can be cast to the desired type of data pointer in order to be dereferenceable.
3. C90 (C++98)C99/C11 (C++11) : A null-pointer indicates either that size was zero (an thus ptr was deallocated), or that the function did not allocate storage (and thus the block pointed by ptr was not modified).

4 示例

示例代码如下所示:

int main() {
   // 初始分配内存
   size_t init_size = 5;
   int* array = (int*)malloc(init_size * sizeof(int));
   // 检查 malloc 是否成功
   if (array == NULL) {
      perror("Failed to allocate memory ");
      exit(1);
   }
   // 初始化内存
   for (size_t i = 0; i < init_size; i++) {
      array[i] = i + 1;
   }
   // 打印数组内容
   printf("扩展前数组大小是 %u,数组元素是 ", init_size);
   for (size_t i = 0; i < init_size; i++) {
      printf("%d ", array[i]);
   }
   printf("\n");
   // 扩展内存
   size_t new_size = 10;
   int* temp = realloc(array, new_size * sizeof(int));
   // 检查 realloc 是否成功
   if (temp == NULL) {
      perror("Failed to reallocate memory ");
      // 释放原来的内存
      free(array);
      exit(1);
   }
   // 更新指针
   array = temp;
   // 初始化新分配的内存
   for (size_t i = init_size; i < new_size; i++) {
      array[i] = i + 1;
   }
   // 打印数组内容
   printf("扩展后数组大小是%u,数组元素是 ", new_size);
   for (size_t i = 0; i < new_size; i++) {
      printf("%d ", array[i]);
   }
   printf("\n");
   // 释放内存
   free(array);
   // 将array设置为NULL
   array = NULL;
   //
   return 0;
}

代码运行结果如下图所示:

在这里插入图片描述

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值