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