在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc().

由字面意思能够知道,该函数的作用是用于又一次分配内存。

使用方式例如以下:

NewPtr=(数据类型*)realloc(OldPtr,MemSize)

当中OldPtr指向 待又一次分配内存的指针。

NewPtr指向 新分配空间的指针。

MemSize为 分配后的空间大小。

该函数的使用涉及下面几个问题:

1.不同情况下的返回值

2.OldPtr指向的内存会不会自己主动释放

3.OldPtr和NewPtr各自是什么内容,他们有什么关系

要解答这个问题,能够从函数的动作流程出发来看:

该函数依据内存是否满足函数需求,完毕下面3个动作之中的一个:

1.检查OldPtr指向的内存块后面的可用内存是否满足本次realloc的需求,假设满足,则将尾部的可用内存也分配给该内存块——指针指向位置不变,内存块内容不变,指向内存块扩大。该情况下,返回值NewPtr = OldPtr;

2.假设OldPtr指向内存块后面的可用内存不够realloc的需求。则完毕下面三个步骤<a>将在可用内存中又一次分配一段MemSize大小的内存,并将这段内存的開始地址返回给NewPtr。<b>将OldPtr内存块的内容拷贝到NewPtr内存块。<c>OldPtr的值不变,但其指向的内存块被释放(注意:是自己主动释放,不用主动调用free)。

笔者某次运行动作2之后的情况如图:

图中程序的作用是:随意长度字符串的输入——每轮循环输入一个字符,将该字符追加于之前输入的字符之后,使其构成一个字符串,并对应增大该字符串所占领的内存空间。

本人依次输入了abcd....

在输入字符abc的时候,当轮循环运行realloc之后的结果是:1.Str和NewStr的值同样,为0x00751cb8。2.其指向的内容一致,为“abc”

在输入到字符d的那一轮循环,运行realloc之后的结果是,1Str的值和NewStr的值不同了。2同一时候能够发现Str指向的内容被重置为“铪铪铪铪铪铪……”
查看其相应内存单元能够发现,将被free重置后的内存 0xee 0xfe 0xee 0xfe……的序列,例如以下图所看到的。



3.假设整个堆其中都没有不论什么一处的内存可以满足realloc的需求。则此次分配失败,返回值为NULL。

结论:在程序中realloc使用中,将OldPtr和NewPtr使用同一个指针是不妥的。使用截图相应程序中的做法较为妥当。既然可以避免分配失败返回NULL之后丢失原有指针。也能同一时候得到旧指针和新指针指向的内存块。

C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。的更多相关文章

  1. SpringMVC Ajax返回的请求json 的方式来解决在中国字符串乱码问题

    1.org.springframework.http.converter.StringHttpMessageConverter类是类处理请求或相应的字符串.和默认字符集ISO-8859-1,所以当返回 ...

  2. Go语言核心之美 4.3-多返回值

    在Go语言中.函数能够有多个返回值,这个特性我们已经在之前的样例见过非常多,非常多标准库函数都会返回两个值,一个是期望得到的函数执行结果,另外一个是函数出错时的错误值. 以下的程序是findlinks ...

  3. shell函数(调用、返回值,返回值获取)

    Shell函数返回值,常用的两种方式:return,echo 1) return 语句shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回.示例1: [devadmin@swa ...

  4. Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能 1.返回顶部 1. 值类型(C# 参考) 2018/11/26 有两种值类型: 结构 枚举 值类型的主 ...

  5. 【C语言学习笔记】C语言函数执行成功时,返回1和返回0,究竟哪个好?

    基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...

  6. 调试台自动多出现一个'&#65279;' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个'&#65279;'

    对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...

  7. <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY

    MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...

  8. C语言atan2()函数:求y/x的反正切值

    头文件:#include <math.h> atan2() 函数用于求 y / x 的反正切值.其原型为:    double atan2(double y, double x); [参数 ...

  9. 用file上传文件时,浏览器返回值总是自动添加<pre>的解决办法

    在返回的JSon字符串里面总是莫名其妙的添加了<pre>标签,例如返回内容为"ok",在浏览器里面就变成了"<pre style="word- ...

随机推荐

  1. PHP - 防止 XSS(跨站脚本攻击)

    <?PHP /** * @blog http://www.phpddt.com * @param $string * @param $low 安全别级低 */ function clean_xs ...

  2. 如何将UISearchBar上"Cancel"按钮改为”取消“?

    别说话,直接上代码 for (id obj in [searchBar subviews]) {        if ([obj isKindOfClass:[UIView class]]) {    ...

  3. 【转】android加载大量图片内存溢出的三种解决办法

    方法一: 在从网络或本地加载图片的时候,只加载缩略图. /** * 按照路径加载图片 * @param path 图片资源的存放路径 * @param scalSize 缩小的倍数 * @return ...

  4. 微软新一代输入法框架 TSF - Text Service Framework 小小的研究

    实际上windows中有两套输入法框架,一套叫做imm32.一套叫做tsf,win7以后的新系统都是优先使用tsf的,现在新出的输入法基本也是基于tsf的. 你可以参考一下这篇文章,虽然是c++的代码 ...

  5. cocos2d-x游戏开发系列教程-中国象棋02-main函数和欢迎页面

    之前两个博客讲述了象棋的规格和工程文件之后,我们继续深入的从代码开始学习cocos2dx 首先从程序入口main函数开始 main函数 int APIENTRY _tWinMain(HINSTANCE ...

  6. mysql备份数据库几种方法

    方法一 cmd 到mysql bin文件夹下用 例如以下命令 mysqldump --opt -h192.168.0.156 -uusername -ppassword --skip-lock-tab ...

  7. Swift - iOS中各种视图控制器(View Controller)的介绍

    在iOS中,不同的视图控制器负责不同的功能,采用不同的风格向用户呈现信息.下面对各个视图控制器做个总结: 1,标准视图控制器 - View Controller 这个控制器只是用来呈现内容.通常会用来 ...

  8. 多图片/文件上传 - SwfUpload/PlUpload

    <文件上传利器SWFUpload使用指南> <前端上传组件Plupload使用指南>

  9. PHP - MySQL数据库

    第15章 MySQL数据库 学习要点: 1.Web数据库概述 2.MySQL的操作 3.MySQL常用函数 4.SQL语句详解 5.phpMyadmin 一.Web数据库概述 现在,我们已经熟悉了PH ...

  10. FastDFS的学习与使用(大量帖子)

    http://www.oschina.net/p/fastdfs http://bbs.chinaunix.net/forum-240-1.html