2012-08-25 55 views
-5

看代码:的realloc和malloc的功能

#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类型和ohter 6个字节通过malloc函数的剩下的2个字节是由其他程序占用,现在当我运行realloc函数来扩展该指针所指向的存储器,它将搜索在存储器10个字节,并且当它不存在,它分配10个字节的存储器,从堆区域并复制malloc的内容并将其粘贴到堆区中新分配的内存区域,然后删除存储在malloc中的内存?

不realloc()的返回NULL指针,因为内存不可用?无权利!? 它确实去堆区的内存分配权?它不会返回一个空指针吗?

+0

'当它不可用时,它会从堆中分配10个字节的内存'它是否必须是“is”而不是“不是”? –

回答

3

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

但是:

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

  2. 在最常见的多任务操作系统,应用程序访问,唯一的记忆就是自己 - 其他应用程序的内存将永远不会让你的方式。但是,由库或其他线程分配的内存也许会。

+0

是啊好吧,看看这个 如果realloc的不能分配10个字节COS的2个字节的其余部分由其他程序将它返回一个空指针占用? – john

+0

另外两个字节*不能被“其他程序”占用;他们有自己的堆可以使用。 – duskwuff

+0

@john你在想什么叫做碎片。 'realloc'有可能无法扩展现有的块。在这种情况下,它从堆中抓取新的块,复制旧的内容并返回新的指针。但是你假设连续调用'malloc'会返回连续的内存。正如暮色指出的那样,通常情况并非如此。例如,malloced内存将有一定的对齐。这也是常见的有在不同范围大小的块多个池(或领域),并使用'mmap'非常大的请求。 –