C++面试题中另一个大板块——内存管理,主要有malloc(free)、new(delete)、calloc、realloc等。今天来说说realloc的用法。

1、头文件

#include <stdlib.h> 有些编译器需要#include <malloc.h>,在TC2.0中可以使用alloc.h头文件

2、realloc()函数原型

void *realloc(void *mem_address, unsigned int newsize)

指针名 = (数据类型*) realloc (要改变内存大小的指针名, 新的大小)

该函数将mem_address所指向的内存块大小扩大到newsize,原有内存中的内容将保持不变。如果重新分配成功则返回指向新分配内存的指针,否则返回空指针NULL。

3、realloc()使用举例

    char *first, *second;//声明两个指向char的指针
first = (char *)malloc(sizeof(char));//先使用malloc分配内存
if(first == NULL)
{
//分配失败
}else
{
//分配成功
} //代码操作 second = (char *)realloc(first, 2*sizeof(char));//使用realloc重新分配扩大内存
if(second == NULL)
{
//分配失败
}else
{
//分配成功
first = second;
}

4、使用要点

a)新的大小一定要大于原来的大小 ,不然的话会导致数据丢失!

b)返回值可能与原指针不同,如果是不同的话,那么realloc完成后,原指针指向的旧内存已被自动free释放掉了;

c)如果返回值NULL,则分配不成功,原指针指向的内存还没有被自动free释放掉,要求程序员free;

d)如果没有足够可用的内存用来完成重新分配(扩大原来的内存块或者分配新的内存块),则返回NULL,而原来的内存块保持不变,不会释放也不会移动。

此时,原来指向的内存还没有free掉,而现在又会找不到原地址,所以在重新分配时,先将新分配的地址赋值给一个新变量second,然后判断secon是否为空,若为空表示分配失败,若不为空给表示分配成功,此时再把second赋值给first。

注意避免first =(char*)realloc(first,*sizeof(char));这种写法,这种操作会造成realloc分配失败后,first原先所指向的内存地址丢失。

d)传递给realloc的指针必须是先前通过malloc()、calloc()、或realloc()分配的;

b)当传给realloc的指针是空指针(0)时,realloc作用相当于malloc;

c)当传给realloc的新大小是0时,realloc作用相当于free,返回NULL;

5、工作机制

realloc是从堆上分配内存的,当扩大一块内存空间时,realloc会直接从堆上现存的数据后面的那些字节中获得附加的字节,先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且返回原地址。

如果空间不够,;但如果数据后面的字节不够的话,先按照新大小分配空间,将原有数据拷贝到新分配的内存块上,而老的内存块会自动free释放掉,同时返回新分配的内存区域首地址。

[开心IT面试题] realloc用法的更多相关文章

  1. realloc 用法

    #include <stdio.h> #include <stdlib.h> #include <string> int main() { char * p_cha ...

  2. realloc() 用法详解

    原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc(要改变内存大小的指针名, ...

  3. QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL

    QT5 QSS QML界面美化视频课程系列 QT原理 项目实战 C++1X STL 课程1   C语言程序设计高级实用速成课程 基础+进阶+自学 课程2   C语言程序设计Windows GDI图形绘 ...

  4. 数据库笔试题(经典select语句的用法)【转载】

    原文地址:数据库笔试题(经典select语句的用法)作者:lily 问题描述: 为管理岗位业务培训信息,建立3个表: S (S#,SN,SD,SA) S#,SN,SD,SA 分别代表学号.学员姓名.所 ...

  5. malloc,calloc,realloc函数用法,原理及不同解析

    https://blog.csdn.net/lixungogogo/article/details/50887028 一.malloc malloc在MSDN中原型为: void *malloc( s ...

  6. 【Java面试题】解释内存中的栈(stack)、堆(heap)和静态存储区的用法

    Java面试题:解释内存中的栈(stack).堆(heap)和静态存储区的用法 堆区: 专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型 ...

  7. ASP.NET中application对象的用法(面试题)

    ASP.NET中application对象的用法 本文导读:Application对象是HttpApplicationState类的一个实例,Application状态是整个应用程序全局的.Appli ...

  8. 面试题:JavaIO流分类详解与常用流用法实例

    Java流概念: Java把所有的有序数据都抽象成流模型,简化了输入输出,理解了流模型就理解了Java IO.可以把流想象成水流,里面的水滴有序的朝某一方向流动.水滴就是数据,且代表着最小的数据流动单 ...

  9. realloc函数的用法

    realloc(void *__ptr, size_t __size):更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小. 如果将分配的内存减少,realloc仅仅是改变索引的 ...

随机推荐

  1. php用于URL的base64

    function base64url_encode($plainText) { $base64 = base64_encode($plainText); $base64url = strtr($bas ...

  2. SQL查询性能分析之(not in)、(and not)、()、(!=)性能比较

    SQL查询性能分析之(not in).(and not).().(!=)性能比较 SQL Server Bruce 3年前 (2013-01-08) 3284浏览 0评论 <:article c ...

  3. 概率图模型之有向图与无向图之间的关系 I map D map perfect map(完美图) 概念

    我们已经讨论了有向图和无向图框架下的概率模型,那么我们有必要讨论一下它们二者的关系.

  4. python学习笔记二--列表

    一.列表: 1. 任意类型对象的位置相关的有序集合. 2. 没有固定大小. 3. 对偏移量进行赋值及各种方法的调用,修改列表. 4. 列表是序列的一种. 5. 所有对字符串的序列操作对列表均适用. 二 ...

  5. C#中string.Format()和ToString()格式化方法

    C#数字格式化输出是我们在编程中经常需要处理的事情,那么这里向你介绍了一些C#数字格式化输出的例子,这样就会方便你来选择和比较,什么方式是比较适合自己项目的. int a = 12345678; C# ...

  6. hdu 1874 畅通工程续(模板题 spfa floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 spfa 模板 #include<iostream> #include<stdio ...

  7. bzoj1001

    平面图求最小割: 其实看bzoj1001一开始着实把我怔住了 AC的人暴多,可自己完全没思路 后来看了某大牛的ppt,才会做 一个月前做这题的吧,今天来简单回忆一下: 首先是欧拉公式 如果一个连通的平 ...

  8. uva1658 admiral

    费用流. 裸的拆点最小费用流,一跑就行. 核弹预警,为何wa20多发.build函数一定要返回true...... 太可怕了 #include<cstdio> #include<al ...

  9. Android访问C#的WebService要注意的问题

    @Overrideprotected String doInBackground(Object... params) { // 根据命名空间和方法得到SoapObject对象 SoapObject s ...

  10. Bsie(鄙视IE)

    http://www.bootcss.com/p/bsie/ 欢迎,这是bsie项目主页. 简介 bsie弥补了Bootstrap对IE6的不兼容.Bootstrap是 twitter.com 推出的 ...