推荐答案
-- -------------------- ---- ------- -------- --------- -------- ---------- --- ------ - --- ----- --- ------------ - -- -- ------ --- - ---- --------------------- - ------------- -- ---- -- ----- - ------------------- ------ -- - -- ----- --- ---- - - -- - - ------------- ---- - ------ - - - -- - -- ---- --- -------- - --- --- - ---- -------------- -------- - ------------- -- ---- -- ----- - --------------------- ------ -- - -- -------- --- ---- - - ------------- - - --------- ---- - ------ - - - -- - -- ---- --- ---- - - -- - - --------- ---- - ---------- -- -------- - ------------- -- ---- ---------- ------ -- -
本题详细解读
realloc 函数的基本用法
realloc
函数用于重新分配内存块的大小。它的原型如下:
void* realloc(void* ptr, size_t size);
ptr
是指向之前分配的内存块的指针。如果ptr
为NULL
,realloc
的行为与malloc
相同,即分配一个新的内存块。size
是新的内存块的大小,以字节为单位。如果size
为 0,realloc
会释放ptr
指向的内存块,并返回NULL
。
realloc 的工作原理
- 扩展内存:如果
realloc
能够扩展当前内存块的大小,它会直接扩展并返回原来的指针。 - 重新分配内存:如果当前内存块无法扩展,
realloc
会分配一个新的内存块,将旧内存块中的数据复制到新内存块中,然后释放旧内存块,并返回新内存块的指针。 - 释放内存:如果
size
为 0,realloc
会释放ptr
指向的内存块,并返回NULL
。
注意事项
- 内存泄漏:如果
realloc
失败并返回NULL
,原来的内存块不会被释放。因此,在使用realloc
时,应该先将返回值赋给一个临时指针,检查是否为NULL
,然后再更新原指针。 - 数据丢失:如果
realloc
需要重新分配内存块,旧内存块中的数据会被复制到新内存块中。如果复制过程中发生错误,可能会导致数据丢失。
示例代码解析
在示例代码中,我们首先使用 malloc
分配了一个大小为 5 的整数数组。然后使用 realloc
将数组大小扩展到 10。最后,我们初始化并打印数组的内容,并释放内存。
通过这个示例,你可以看到 realloc
如何在不丢失原有数据的情况下扩展内存块的大小。