一、realloc函数的几点说明
1.如果realloc()函数的第一个参数是NULL,那么系统就会分配第二个参数指定的新内存,并返回新内存单元的首字节的指针。此时,realloc()函数类似于malloc()函数。如果第一个参数不是NULL,但不指向以前分配的内存,或者指向已经free的内存单元,那么结果就是不确定的。
2.realloc()函数保存了第一个参数对应的内存单元的内容,且保存的量是新旧内存单元里较小的那一个。如果新内存单元大于旧内存单元,那么新增的内存就不会被初始化,而是包含垃圾值。
3.使用内存分配函数时,应该尽量避免多次分配小的内存单元,因为分配堆上的内存有一些系统开销,所以分配许多小的内存单元比分配几个大的内存单元的系统开销大。
4.注意realloc()函数的返回值,要分两种情况:
C语言代码:
这个源代码对应第一种情况。以此段代码为例,使用realloc()函数时编译器自动在p对应的内存单元后找内存单元,如果p单元后有足够大的内存空间则直接在原内存单元后续接一段内存单元,组成新的内存单元,返回的值为原来的内存单元首字节的指针。实际释放内存时只需释放p对应的内存单元。
下面的源代码和运行结果对应第二种情况。以下面的代码为例,realloc()函数没法在原p对应的内存单元后找到一段足够大的连续内存单元与原内存单元一起存储30000个字节的值,所以只好在堆上原内存单元的后面重新寻找一段30000个字节长的连续内存单元,然后返回该新内存单元的首字母的指针。同时原数据块移动到新的内存单元里,实际释放内存时应该只释放新开辟的内存单元。
唉,一不小心这篇文章已经写得很多了,再写个续来讲堆和栈吧,看官见谅。