realloc和malloc函数

时间:2012-08-25 06:23:31

标签: c memory-management malloc realloc

查看代码:

#include<stdio.h>


 #include<stdlib.h>
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指针吗?

2 个答案:

答案 0 :(得分:3)

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

<强>但是:

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

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

答案 1 :(得分:1)

正如specification for realloc所述:

  

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