malloc,calloc,ralloc

来源:互联网 发布:mac怎么玩dota2国服 编辑:程序博客网 时间:2024/05/22 16:55

在内存中的4g划分中堆空间就是专门存放malloc,calloc,ralloc这几个分配空间的函数,下面就简单介绍一下他们的区别:


1.malloc()

(1)函数原型

void *malloc(unsigned int num_bytes);

(2)功能

请求系统动态分配num_bytes个字节的空间,如果分配成功则返回第一个字节的地址,并且可以进行强制类型转换,告诉系统分配空间中存储的是那种类型的数据。否则返回空指

针NULL。

(3)当内存不在使用时,要用使用free函数将内存释放。

2.ralloc

(1)函数原型

void *ralloc(void *mem_address,unsigned int newsize);

(2)功能

先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够, 先按照newsize指定的大小分配空间,将原有

数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域(注意:原来指针是自动释放,不需要使用free),同时返回新分配的内存区域的首地址。即

重新分配存储器块的地址。

如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

(3)同样的当内存不在使用时,要用使用free函数将内存释放。

(4)使用ralloc函数的注意事项

(1)ralloc失败的时候,返回NULL。

(2)ralloc失败的时候,原来的内存不改变,不会释放也不会移动。

(3)假如原来的内存后面还有足够多剩余内存的话,ralloc的内存=原来的内存+剩余内存,ralloc还是返回原来内存的地址;假如原来的内存后面没有足够多剩余内存的话,ralloc

将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,ralloc返回新内存的地址。

(4)如果size为0,效果等同于free()。

(5)传递给ralloc的指针必须是先前通过malloc(), calloc(),或ralloc()分配的

(6)传递给ralloc的指针可以为空,等同于malloc。

3.calloc

(1)函数原型

void *calloc(size_t n, size_t size);

(2)功能

在内存的动态分配区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

4.区别:

malloc不能初始化所分配的内存空间,而函数calloc能。如果malloc函数分配的内存空间原来没有被使用过,则其中的

每一位可能都是0;反之,如果这部分内存曾经被分配过,则其中可能遗留各种各样的数据,也就是说,使用malloc函

数的程序开始时(内存还没有被重新分配)能正常进行,但经过一段时间(内存已经被重新分配,可能会出现一

些问题)。

ralloc可以对给定的指针所指向的空间进行扩大或缩小,无论是扩大还是缩小,原有的内存中的内容将保持不变,当

然,对于缩小,则被缩小的那一部分的内容将会丢失,ralloc并不保持调整后的内存空间和原来的 内存空间保持同一

内存地址,ralloc返回的指针很可能指向新的地址。

calloc会将所分配的空间中的每一位都初始化为零,也就是说如果你是字符类型或整数类型的元素分配内存,那么这

些元素将保证会被动的初始化为0,如果你为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针。如

果你为实型元素分配内存,则这些元素会被初始化为浮点型的0。

0 0