Realloc函数及其使用注意事项

简介: 1、Realloc函数功能说明 Realloc函数的功能比malloc和calloc函数更丰富,可以实现内存分配和内存释放的功能,函数原型如下: void *realloc(void *p,int n); 其中,指针p必须为指向堆内存空间的指针,即必须由malloc函数和calloc函数或者realloc函数分配空间的指针。

1、Realloc函数功能说明

Realloc函数的功能比malloc和calloc函数更丰富,可以实现内存分配和内存释放的功能,函数原型如下:

void *realloc(void *p,int n);

其中,指针p必须为指向堆内存空间的指针,即必须由malloc函数和calloc函数或者realloc函数分配空间的指针。

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回;

如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。

realloc函数分配的空间也是未初始化的。

 

2、案例一、

#include "stdafx.h" 
#include  
#include  
#include 
int main( void ) 
{ 
   long *buffer, *oldbuffer; 
   size_t size;
   if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL ) 
      exit( 1 );
   size = _msize( buffer ); 
   printf_s( "Size of block after malloc of 1000 longs: %u,buffer addr=%p\\n", size,buffer );
   // Reallocate and show new size: 
   oldbuffer = buffer;     // save pointer in case realloc fails 
   if( (buffer = (long*)realloc( buffer, size + (1000 * sizeof( long )) )) ==  NULL ) 
   { 
      free( oldbuffer );  // free original block 
      exit( 1 ); 
   } 
   size = _msize( buffer ); 
   printf_s( "Size of block after realloc of 1000 more longs: %u,buffer addr=%p\\n", size,buffer );
   free( buffer );          // Other way to release it: realloc(p,0),p=NULL 
   getchar(); 
   exit( 0 ); 
}

image

3、案例二、

#include "stdafx.h" 
#include  
#include 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int *p = NULL; 
    p = (int *)malloc(sizeof(int)); 
    *p  = 3; 
    printf(" p = %p \\n",p); 
    printf(" p = %d \\n",*p);
    p = (int*)realloc(p,10*sizeof(int)); 
    printf(" p = %p \\n",p); 
    printf(" p = %d \\n",*p);
    p = (int*)realloc(p,100*sizeof(int)); 
    printf(" p = %p \\n",p); 
    printf(" p = %d \\n",*p);
    // 释放P指向的空间,特别注意!这里没有用Free 
    realloc(p,0); 
    p = NULL; 
    getchar(); 
    return 0; 
}

image

 

综合注意点:

使用malloc,calloc,realloc函数分配的内存空间都要使用Free函数或者指针参数为NULL的realloc函数来释放。

相关文章
|
存储 缓存 网络协议
DPDK入门(环境搭建以及小demo)
DPDK入门(环境搭建以及小demo)
1178 0
|
Web App开发 自然语言处理 监控
基于 WebAssembly 的AIoT应用框架实践
天猫精灵大前端团队基于 WebAssembly 的AIoT应用框架实践分享。
基于 WebAssembly 的AIoT应用框架实践
|
3月前
|
机器学习/深度学习 人工智能 自动驾驶
AI Agent多模态融合策略研究与实证应用
本文从多模态信息融合的理论基础出发,构建了一个结合图像与文本的AI Agent模型,并通过PyTorch代码实现了完整的图文问答流程。未来,多模态智能体将在医疗、自动驾驶、虚拟助手等领域展现巨大潜力。模型优化的核心是提升不同模态的协同理解与推理能力,从而打造真正“理解世界”的AI Agent。
AI Agent多模态融合策略研究与实证应用
|
消息中间件 Java 测试技术
性能工具之Jmeter扩展函数及压测ActiveMQ实践
【5月更文挑战第18天】性能工具之Jmeter扩展函数及压测ActiveMQ实践
240 5
|
12月前
|
运维 监控 Cloud Native
运维之道:从基础到进阶的实战指南
【10月更文挑战第20天】 在数字化时代,运维作为保障系统稳定运行的重要环节,其重要性不言而喻。本文将带你深入探索运维的核心领域,从基础概念解析到进阶技能提升,通过一系列实用的技巧和策略,帮助你构建高效、可靠的运维体系,确保业务连续性和数据安全。
613 6
|
Ubuntu 应用服务中间件 Linux
在Linux中,如何查看Apache或Nginx服务的状态?
在Linux中,如何查看Apache或Nginx服务的状态?
|
消息中间件 存储 Cloud Native
深度剖析 RocketMQ 5.0,架构解析:云原生架构如何支撑多元化场景?
了解 RocketMQ 5.0 的核心概念和架构概览;然后我们会从集群角度出发,从宏观视角学习 RocketMQ 的管控链路、数据链路、客户端和服务端如何交互;学习 RocketMQ 如何实现数据的存储,数据的高可用,如何利用云原生存储进一步提升竞争力。
142728 3
|
存储 缓存 网络架构
计算机网络——三种交换方式(电路交换、分组交换、报文交换以及优缺点)
计算机网络——三种交换方式(电路交换、分组交换、报文交换以及优缺点)
1075 0
|
编译器 C++ 计算机视觉
include包含文件查找的顺序 .
从microsoft网站上找到关于#include Directive (C/C++)的相关问题解释如下: The #include directive tells the preprocessor to treat the contents of a specified file as if t...
1487 0
|
iOS开发
iOS 统计Xcode项目代码行数
iOS 统计Xcode项目代码行数
407 0