_alloc:
原型:void *_alloc(size_t size);
本函数与其他几个函数不同,因为它是在栈上分配了size大小的内存,因此使用此函数分配的内存不用再担心内存释放的情况了。但是使用此函数需要注意的是:在函数内部使用此函数分配的内存随着函数的终结不复存在,因此不能将此函数分配的内存供函数外部使用。
Malloc:
原型:void * malloc(size_t size); 该函数将在堆上分配一个size byte大小的内存。它分配的单原完全按字节大小计算,因此如此分配N个单原的student_t,那么要这样实现:(stdent_t *)malloc(N * sizeof (student_t));malloc分配的是连续内存块,如果有内存泄漏或存在过度的内存碎片,会导致能使用该函数分配的内存大小有一定的,当所申请的内存大小超过了内存中能分配的最大连续内存块大小时,就会分配失败,返回NULL.
calloc:
调用形式为(类型*)calloc(n,size):在内存的动态存储区中分配n块长度为“size”字节的连续区域,返回首地址。 这n块存储区应该在内存中是连续的(返回的只是一个首地址,如不连续则分配的其他n-1块内存块无法访问)。
malloc与calloc没有本质区别,malloc之后的未初始化内存可以使用memset进行初始化。calloc就是一次分配多个size大小的内存。
realloc调用形式为(类型*)realloc(*ptr,size):realloc是在malloc的基础上增加(也可能是减少)内存分配。将ptr内存大小增大到size。
free的调用形式为free(void*ptr):释放ptr所指向的一块内存空间。 条件1:如果新分配的空间大于以前所分配的空间.
如果当前分配的内存块后连续跟着有足够多的内存空间,则首地址不变,只不过内存大小扩大。否则会在内存其他区域分配一块新申请的内存块,然后将以前内存块中的数据拷贝到新内存块中,先前分配的内存块会自动释放(改变标记为可用)。
条件2:如果新分配的空间小于先前分配的空间。
这样会在一先前分配的空间首地址开始分配一块新大小的内存空间,内部数据不变,超出新大小的内存部分数据丢失。
free函数是用于释放申请的内存的函数,因为在堆上申请的内存是需要程序员自己释放的。如果申请的空间在使用完以后没有使用free函数释放就会导致该内存会被一直占用(叫内存泄露),从而导致能被使用的内存块越来越小。
通常造成内存分配失败的原因如下: 1、 内存访问越界
2、 所需连续的内存空间不足