C语言 realloc为什么要有返回值,realloc返回值具体解释/(解决随意长度字符串输入问题)。
在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返回值具体解释/(解决随意长度字符串输入问题)。的更多相关文章
- SpringMVC Ajax返回的请求json
的方式来解决在中国字符串乱码问题
1.org.springframework.http.converter.StringHttpMessageConverter类是类处理请求或相应的字符串.和默认字符集ISO-8859-1,所以当返回 ...
- Go语言核心之美 4.3-多返回值
在Go语言中.函数能够有多个返回值,这个特性我们已经在之前的样例见过非常多,非常多标准库函数都会返回两个值,一个是期望得到的函数执行结果,另外一个是函数出错时的错误值. 以下的程序是findlinks ...
- shell函数(调用、返回值,返回值获取)
Shell函数返回值,常用的两种方式:return,echo 1) return 语句shell函数的返回值,可以和其他语言的返回值一样,通过return语句返回.示例1: [devadmin@swa ...
- Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-内置类型-值类型:值类型的功能 1.返回顶部 1. 值类型(C# 参考) 2018/11/26 有两种值类型: 结构 枚举 值类型的主 ...
- 【C语言学习笔记】C语言函数执行成功时,返回1和返回0,究竟哪个好?
基本上,没有人会将大段的C语言代码全部塞入 main() 函数,更好的做法是按照复用率高,耦合性低的原则,尽可能的将代码拆分不同的功能模块,并封装成函数.C语言代码的组合千变万化,因此函数的功能可能会 ...
- 调试台自动多出现一个'' ,我 用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个''
对你有助请点赞,请顶,不好请踩------送人玫瑰,手留余香! 15:54 2016/3/12用uploadify上传图片时,在给页面写入一个返回值为图片名称的变量的值的时候值的前面始终多出现一个' ...
- <转>SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY
MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值 ...
- C语言atan2()函数:求y/x的反正切值
头文件:#include <math.h> atan2() 函数用于求 y / x 的反正切值.其原型为: double atan2(double y, double x); [参数 ...
- 用file上传文件时,浏览器返回值总是自动添加<pre>的解决办法
在返回的JSon字符串里面总是莫名其妙的添加了<pre>标签,例如返回内容为"ok",在浏览器里面就变成了"<pre style="word- ...
随机推荐
- 再造 “手机QQ” 侧滑菜单(二)——高仿左视图
代码示例:https://github.com/johnlui/SwiftSideslipLikeQQ 本篇文章中,我们将一起使用 Auto Layout 高仿手Q的左侧视图,力争达成从布局到动画的全 ...
- Python 第五篇(下):系统标准模块(shutil、logging、shelve、configparser、subprocess、xml、yaml、自定义模块)
目录: shutil logging模块 shelve configparser subprocess xml处理 yaml处理 自定义模块 一,系统标准模块: 1.shutil:是一种高层次的文件操 ...
- LVS--什么是LVS?
1.什么是LVS? 首先简单介绍一下LVS (Linux Virtual Server)到底是什么东西,其实它是一种集群(Cluster)技术,采用IP负载均衡技术和基于内容请求分发技术.调度器具有很 ...
- java--类继承和实现的接口中含有相同的方法
首先,说一下,当某一个类实现了两个接口的时候,两个接口中存在两个相同的方法,在实现的类中只需实现一个方法的方法体. 当一个类继承一个类,并且实现一个或者多个接口的时候,其中,父类和父接口中存在相同的方 ...
- ArrayList内元素按照字典排序
package day08; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; ...
- 第14周 项目三-OOP版电子词典
做一个简单的电子词典.在文件dictionary.txt中,保存的是英汉对比的一个词典,词汇量近8000个,英文.中文释义与词性间用'\t'隔开. (1)编程序,由用户输入英文词.显示词性和中文释义. ...
- Android 富文本框实现 RichEditText
Android系统自带控件没有富文本框控件,如果想写一封带格式的邮件基本上不可能,EdtiText只有默认一种格式,显示不能滿足要求,!!正好项目需要研究了一下,开发了此控件,现将一些源代码开放一下, ...
- Sting和StringBuffer的区别
java.lang.String代表不可变序列: s1 = "hello"; s2 = "world"; s1 = s1 + s2; 内存分配情况是s1有块内存 ...
- 我的mysql数据库sql优化原则
原文 我的mysql数据库sql优化原则 一.前提 这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异.我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待. ...
- javascript 回调函数应用
回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你”这是一个异步 ...