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

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之后的情况如图:

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

图中程序的作用是:任意长度字符串的输入——每轮循环输入一个字符,将该字符追加于之前输入的字符之后,使其构成一个字符串,并相应增大该字符串所占据的内存空间。

        本人依次输入了abcd....

        在输入字符abc的时候,当轮循环执行realloc之后的结果是:1.Str和NewStr的值相同,为0x00751cb8。2.其指向的内容一致,为“abc”

        在输入到字符d的那一轮循环,执行realloc之后的结果是,1Str的值和NewStr的值不同了。2同时可以发现Str指向的内容被重置为“铪铪铪铪铪铪……” 查看其对应内存单元可以发现,将被free重置后的内存 0xee 0xfe 0xee 0xfe……的序列,如下图所示。

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

        3.如果整个堆当中都没有任何一处的内存能够满足realloc的需求。则此次分配失败,返回值为NULL。

        结论:在程序中realloc使用中,将OldPtr和NewPtr使用同一个指针是不妥的。使用截图对应程序中的做法较为妥当。既然能够避免分配失败返回NULL之后丢失原有指针。也能同时得到旧指针和新指针指向的内存块。