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函数来释放。

相关文章
|
4月前
|
存储 编译器
当调用一个C函数,在内存上发生了什么?
在这个过程中,内存的分配和释放主要发生在调用栈上,包括局部变量和函数调用的参数。这样的设计使得函数调用可以嵌套,每次调用都有自己的局部环境。
函数调用的方式有几种
函数调用的方式有几种
|
4月前
|
C语言
C语言函数实例
【1月更文挑战第19天】C语言函数实例。
18 0
|
人工智能 编译器 C语言
如何使用函数及函数的注意事项
目录 什么是函数? 如何调用函数? 函数的先后关系? 函数的变量空间? 什么是函数? 首先我们来说一说函数的作用,就是一块简单的代码接受零个或多个参数,做一件事情,并返回零个或一个值 void sum(int a,int b) { int i; int sum=0; for(i=a:i<=b;i++) { sum+=i; } printf("%d到%d的和是%d\n",a,b,sum); } 现在我们就写出了一个简单的求和函数和数学中的y=f(x)很像 函数名 sum 返回类型 void 参数表 int a,int b 函数体 大括号里的所有东西 函数头 大括号前
|
程序员 编译器 C语言
动态内存的定义及使用(附常见错误点)
动态内存的定义及使用(附常见错误点)
133 0
动态内存的定义及使用(附常见错误点)
|
C语言
函数传址调用的基本解析
函数传址调用的基本解析
91 0
函数传址调用的基本解析
简单手写async函数,让生成器函数自动执行
简单手写async函数,让生成器函数自动执行
167 0
|
C++
变量被析构函数释放的时候的注意事项
变量被析构函数释放的时候的注意事项
104 0
变量被析构函数释放的时候的注意事项
|
C语言
C语言完成通讯录(内含解析和操作注意事项) 要求将函数分为:函数声明部分,函数主要部分,各个函数实现部分
C语言完成通讯录(内含解析和操作注意事项) 要求将函数分为:函数声明部分,函数主要部分,各个函数实现部分
60 0
C语言完成通讯录(内含解析和操作注意事项) 要求将函数分为:函数声明部分,函数主要部分,各个函数实现部分
memmove函数使用方法,案例,注意事项以及自制函数实现memmove函数
memmove函数使用方法,案例,注意事项以及自制函数实现memmove函数
123 0