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不初始化,里边数据是随机的垃圾数据。
一个在努力中的未来程序员,如果有更好的想法,欢迎评论。