• 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之后丢失原有指针。也能同一时候得到旧指针和新指针指向的内存块。


  • 相关阅读:
    PHP Cookbook读书笔记 – 第18章安全和加密
    ANDROID开发之http调试常见错误
    GD库之有意思的imagesetstyle
    PHP Cookbook读书笔记 – 第06章函数
    PHP Cookbook读书笔记 – 第09章表单
    PHP Cookbook读书笔记 – 第04章数组
    PHP Cookbook读书笔记 – 第17章图形
    PHP常见面试问题
    SQL SERVER 表分区实施步奏
    PHP Cookbook读书笔记 – 第12章XML
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/3904524.html
Copyright © 2020-2023  润新知