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返回值详解/(解决任意长度字符串输入问题)。,布布扣,bubuko.com

时间: 2024-12-24 14:51:41

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

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

在C语言操作中会用到大量的内存操作,当中非经常常使用的一个是realloc(). 由字面意思能够知道,该函数的作用是用于又一次分配内存. 使用方式例如以下: NewPtr=(数据类型*)realloc(OldPtr,MemSize) 当中OldPtr指向 待又一次分配内存的指针. NewPtr指向 新分配空间的指针. MemSize为 分配后的空间大小. 该函数的使用涉及下面几个问题: 1.不同情况下的返回值 2.OldPtr指向的内存会不会自己主动释放 3.OldPtr和NewPtr各自是什么

【C语言天天练(二十)】scanf函数详解

引言:scanf函数虽然是学习C语言时比较早就接触的一个函数,但在使用过程中,发现真正掌握它却并不容易.本文就通过各种例子来详细的总结一下该函数的各种用法,假设它的调用格式为 scanf("<格式化字符串>",<地址表>). 1.一般使用scanf函数时都是为某个变量赋值,不考虑它的返回值.但是任何函数都是需要返回的(即使返回类型用void,也可以认为只是调用了return语句,只是并没有返回什么东西而已),同样的scanf函数也是有返回的,它的返回值是成功读取

【C语言天天练(十四)】const关键字详解

const是一个C语言的关键字,它限定一个变量不允许被改变.使用const在一定程度上可以提高程序的安全性和可靠性,另外,了解const的作用,在看别人的代码时,对理解对方的程序有一定帮助. 1.const可以理解成是"只读变量"的限定词,从这里可以看出,const修饰的是变量,跟常量是不同的,常量是被编译器放在内存中的只读区域,当然也就不能够去修改它.而"只读变量"则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改.const就是用来限定一

jQuery对html元素的取值与赋值实例详解

jQuery对html元素的取值与赋值实例详解 转载  2015-12-18   作者:欢欢   我要评论 这篇文章主要介绍了jQuery对html元素的取值与赋值,较为详细的分析了jQuery针对常见html元素的获取与赋值技巧,非常简单实用,需要的朋友可以参考下 本文实例讲述了jQuery对html元素的取值与赋值方法.分享给大家供大家参考,具体如下: Jquery给基本控件的取值.赋值 TEXTBOX: ? 1 2 3 4 5 var str = $('#txt').val(); $('#

Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解

博文说明[前言]: 本文将通过个人口吻介绍Linux字符集和系统语言设置,包括LANG,locale,LC_ALL,POSIX等命令及参数详解的相关知识,在目前时间点[2017年6月21号]下,所掌握的技术水平有限,可能会存在不少知识理解不够深入或全面,望大家指出问题共同交流,在后续工作及学习中如发现本文内容与实际情况有所偏差,将会完善该博文内容. 本文参考文献引用链接: 1.http://blog.csdn.net/z4213489/article/details/7937894[好文,必看]

go语言之行--golang核武器goroutine调度原理、channel详解

一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它是处于异步方式运行,你不需要等它运行完成以后在执行以后的代码. go func()//通过go关键字启动一个协程来运行函数 二.goroutine内部原理 概念介绍 在进行实现原理之前,了解下一些关键性术语的概念. 并发 一个cpu上能同时执行多项任务,在很短时间内,cpu来

SpringMVC返回(return)方式详解

package com.boventech.learning.controller; import java.util.HashMap; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import or

朱、刘算法:求最小树形图权值个人理解+个人详解【最小树形图模板】

什么是最小树形图?相信大家如果会过来看这篇文章,想必也应该对最小生成树有所了解的,最小生成树求的是无向图的一颗生成树的最小权值.我们的最小树形图就是来解决一个有向图的一颗生成树的最小权值,对于度娘来说,最小树形图是这样定义的:最小树形图,就是给有向带权图中指定一个特殊的点root,求一棵以root为根的有向生成树T,并且T中所有边的总权值最小. 通解最小树形图的一种算法是是1965年朱永津和刘振宏提出的复杂度为O(VE)的算法:朱.刘算法. 今天我们就来浅谈一下最小树形图的问题. 大题上完整的朱

C语言如何接收通过键盘输入的任意长度字符串

有时候需要对用户输入的字符串进行处理,由于事先不知道用户会一次性输入多长的字符串,一般有三种处理方法: 1.根据估计用户最多输入字符串长度进行申请空间. 2.使用getch.scanf(%c)等一个字符一个字符的接收处理. 3.使用 while(1) { scanf("%1000s",&str); .... //对str字串进行处理 ... //在末尾 if(strlen(str)!=1000)//如果长度不为1000说明已经接收完,此时可以跳出循环 break; } 第一种方