-4

看代码:

#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 个字节,其中 2 个字节被声明为 int 类型的指针使用,另外 6 个字节由 malloc 函数占用,其余 2 个字节被其他程序占用,现在当我运行 realloc 函数时为了扩展指针指向的内存,它将在内存中搜索 10 个字节,当它不可用时,它从堆区域分配 10 个字节的内存并复制 malloc 的内容并将其粘贴到堆区域的新分配内存区域中,并且然后删除存储在malloc中的内存对吗?

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

4

2 回答 2

3

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

然而:

  1. malloc实现通常不在字节粒度上操作。我见过的大多数都将所有内容四舍五入到最接近的 16 个字节,因为它使记帐更容易,而且许多用户无论如何都需要这种对齐方式。在您的情况下,这最终会导致realloc无操作,因为两种大小都最多为 16 个字节。

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

于 2012-08-25T06:29:40.260 回答
1

realloc 规范中所述:

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

于 2012-08-25T06:29:37.220 回答