C语言 malloc realloc calloc

来源:互联网 发布:企业的域名 编辑:程序博客网 时间:2024/05/17 07:36

1 malloc 

在C语言中,用到指针就会想到动态分配空间,动态分配空间最基础的就是malloc。


头文件:stdlib.h或malloc.h(realloc和calloc也一样)


void *malloc(size_t size);


功能:分配长度为num_bytes字节的内存块


返回值:如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。


malloc实现:

简单来说,就是在堆上将可用的空间链接起来,形成一块块可用的空间,malloc就是找到那个空间的信息然后返回它的地址。定义了Header保存每个存储器块的信息,信息有指向下个链表的指针,当前分配的长度,还有存储器元素排在合理的字节边界上,根据系统不同,都不一样。



2 realloc

void * realloc(void *__ptr, size_t __size);


功能:更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。


如果将分配的内存减少,realloc仅仅是改变索引的信息。


如果是将分配的内存扩大,则有以下情况:
1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。
2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。
3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。


因为有可能分配不成功,所以关于这一点的确要注意,最好如下:
int *q;
q = (int *) realloc (p, sizeof(int)  * 15);

if( ! q )

{

    p = q;

}


3 calloc

 void* calloc (size_t num, size_t size);

功能:calloc() 在内存中动态地分配 num 个长度为 size 的连续空间,并将每一个字节都初始化为 0。所以它的结果是分配了 num*size 个字节长度的内存空间,并且每个字节的值都是0。


跟malloc的区别:
  calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。


一个在努力中的未来程序员,如果有更好的想法,欢迎评论。


0 0
原创粉丝点击