realloc和malloc函数

看看代码:

#include #include void main() { int *p; p = malloc(6); p = realloc(p, 10); if (p == NULL) { printf("error"); exit(1); } } 

以此示例为代码,假设总内存为10个字节,并且通过malloc函数指定类型为int和ohter 6字节的声明使用2个字节,剩余的2个字节被其他程序占用,现在当我运行realloc函数时为了扩展指针指向的内存,它将在内存中搜索10个字节,当它不可用时,它从堆区域分配10个字节的内存并复制malloc的内容并将其粘贴到堆区域中的新分配的内存区域中。然后删除存储在malloc中的内存吧?

realloc()是否返回NULL指针,因为内存不可用? 没有权利!? 它确实进入堆区域进行内存分配吗? 它不会返回NULL指针吗?

正确 – 如果realloc无法调整您传入的内存块的大小,则会生成一个新内存块,复制数据并释放旧数据。

然而:

  1. malloc实现通常不以字节粒度运行。 我见过的大多数都是将所有内容都整理到最接近的16个字节,因为它使会计更容易,并且许多用户无论如何都需要这种对齐。 在您的情况下,这将最终使realloc成为无操作,因为两个大小最多为16个字节。

  2. 在大多数常见的多任务操作系统中,您的应用程序可访问的唯一内存是它自己的 – 其他应用程序的内存永远不会妨碍您。 但是,库或其他线程分配的内存可能会。

正如realloc规范中所述 :

如果存储器对象的新大小需要移动对象,则释放用于先前实例化对象的空间。