在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. Android 电话自己主动接听和挂断具体解释

    1.通过aidl及反射实现挂断电话 详细分三步: (1)ITelephony.aidl ,必须新建com.android.internal.telephony包并放入ITelephony.aidl文件 ...

  2. TROUBLE SHOOTING: FRM-30425

    关键字:Oracle Form buider FRM-30425 汇总 错误信息如下: FRM-30425: Summarized database item must reside in a blo ...

  3. SQL__用命令删除定期的备份数据库文件

    用计划任务可以定期执行下列语句: FORFILES /P e:\test /M *.bak /C "cmd /C del /Q @path" /d -4 其中可更换目录与文件类型. ...

  4. MinGW开发工具的安装

    MinGW是Minimalist GNU for Windows的缩写,是把linux下的GNU开发工具包移植到windows的项目之一.和Cygwin不一样的是,MinGW不提供linux的posi ...

  5. hdu4722之简单数位dp

    Good Numbers Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  6. poj2533--Longest Ordered Subsequence(dp:最长上升子序列)

    Longest Ordered Subsequence Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 33943   Acc ...

  7. BZOJ 1101: [POI2007]Zap( 莫比乌斯反演 )

    求 answer = ∑ [gcd(x, y) = d] (1 <= x <= a, 1 <= y <= b) . 令a' = a / d, b' = b / d, 化简一下得 ...

  8. bash on windows

    bash on windows 今年微软Build 2016大会最让开发人员兴奋的消息之一,就是在Windows上可以原生运行Linux bash,对开发人员来说,这是一个喜闻乐见的消息. 1 安装 ...

  9. 打算自己做app,你们做过吗?

    最近手头上资金不足,想自己搞一下app赚点广告费,解决一下自己的零花钱问题,各位有没有做自己的app呢?打算用有米广告,各位觉得怎么样? 你们的收益是如何呢?能在这里晒晒吗?

  10. Netty源代码学习——ChannelPipeline模型分析

    參考Netty API io.netty.channel.ChannelPipeline A list of ChannelHandlers which handles or intercepts i ...