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返回值具体解释/(解决随意长度字符串输入问题)。

时间: 2024-11-05 14:38:58

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

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

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

Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到的值然后返回POJO对象呢?

public void setAccessible(boolean flag) throws SecurityException将此对象的 accessible 标志设置为指示的布尔值.值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查.值为 false 则指示反射的对象应该实施 Java 语言访问检查.参考博文:http://www.cnblogs.com/sunxucool/p/3552985.html Hibernate通过什么方法可以把私有成员变量赋值成数据库查询到

【笔记】关于jq $.ajax 函数 success回调函数不能赋正确值或返回正确值的问题

最近在一个项目里面打算实现如下功能: 当我注册账号的时候当输入账号完毕后输入框失焦时执行一个 ajax 请求,验证账号是否被注册,并未这个输入框的 isCorrect属性赋值,如果没有被注册 isCorrect属性值为"true",否则为 "false".代码如下: ajax: function(obj){ /* { elem: //验证的元素, hintsContent: //提示框元素, errorColor: //错误时显示的颜色, url: //后台处理页地

Android——关于Activity跳转的返回(无返回值和有返回值)——无返回值

一.无返回值 跳转页面,并将第一页的Edittext输入的数据通过按钮Button传到第二页用Edittext显示,点击第二页的 返回按钮Button返回第一页(改变第二页的Edittext的内容不能返回至第一页) ——普通方式,没有返回值的方式 1.给第一页面Edittext和Button设置id 2.设置Button的点击监听 (1)获取view实例,通过Edittext的id找到Edittext (2)获取内容并转为文本形式 getText().toString() (3)设置Intent

SpringMVC中使用@ResponseBody注解返回值,Ajax取得中文乱码解决方法

Spring使用AnnotationMethodHandlerAdapter的handleResponseBody方法, AnnotationMethodHandlerAdapter使用request header中"Accept"的值和messageConverter支持的MediaType进行匹配,然后会用"Accept"的第一个值写入 response的"Content-Type".一般的请求都是通过浏览器进行的,request heade

Python--函数内部变量都是临时的,当函数返回以后,返回值可以赋予一个变量。

#coding=utf-8print "Let's practice everything."print ' You\'d need to know\'bout escapes with \\ that do \n newlines and \t tabs.' poem = """\tThe lovely worldwith logic so firmly plantedcannot discern \n the needs of lovenor comp

Python List pop()方法-用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值

描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list.pop(obj=list[-1]) 参数 obj -- 可选参数,要移除列表元素的对象. 返回值 该方法返回从列表中移除的元素对象. 实例 以下实例展示了 pop()函数的使用方法: #!/usr/bin/python aList = [123, 'xyz', 'zara', 'abc']; print "A List : ", aList.pop(); pr

&lt;转&gt;SQL Server返回最后一个标识值的三个函数:IDENT_CURRENT、@@IDENTITY、SCOPE_IDENTITY

MSDN对官方解释:这三个函数都返回最后生成的标识值. 但是,上述每个函数中定义的“最后”的作用域和会话有所不同. 1.IDENT_CURRENT 返回为某个会话和当前作用域中的指定表生成的最新标识值. 如果 IDENT_CURRENT 值为 NULL(因为表从未包含行或已被截断),IDENT_CURRENT 函数将返回种子值. 2.@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值. 如果语句未影响任何包含标识列的表,则 @@IDENTITY 返回 NULL. 如果插

HDOJ 排序(pow函数的调用值及返回值类型)

注:pow函数包含在头文件math.h中,pow(a,b)既表示a的b次幂.pow函数的调用值与返回值都为浮点型, 既double N=pow(double a,double b)或float N(float a,float b). 例题: 排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 36580    Accepted Sub