在C语言中有主要由以下四个内存管理的函数:(以下的4个函数都在stdlib.h头文件中,)
1. malloc
2.calloc
3.realloc
4.free
前三个函数用来申请内存空间,最后一个函数free用来释放由前三个函数申请的堆内存空间,且只能用free来释放。前三个函数的返回值都是void *(空指针类型), free的返回类型是void。
对于这几个内存管理的函数有如下注意的地方:
1) malloc 最常用,它用来申请一段堆内存的空间,函数原型是void *malloc( size_t size );注意在用malloc
申请空间的时候,一定要检查申请是否成功,即判断它返回的指针值是否是NULL,另外malloc申请到的内存经常 要进行强制类型转换成我们需要的类型。
例1: int *p = (int *)malloc( 100 * sizeof(int)); //申请了400字节的内存空间,用来存放整型数据
if(p != NULL) 接着执行代码。。。//一定要判断,不管内存大小有多小
2) calloc 一般用的较少,它的作用和malloc基本一样,原型void *calloc( size_t num, size_t size );
我们把num乘以size就得到和malloc中size一样的效果了。如
例2:int *p = (int*)calloc(100, sizeof(int)); //效果和例1中的效果基本一样。
但是有一点要注意:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始 化,里边数据是随机的垃圾数据。
可以写一个小程序测试一下:
- //malloc测试:
- #include <stdlib.h>
- #include <stdio.h>
- int main()
- {
- int *p = (int*)malloc(12);
- printf("%d, %d, %d", p[0], p[1], p[2]);
- printf("\n");
- }//在我机器上输-842150451, -842150451, -842150451
- //calloc测试
- #include <stdlib.h>
- #include <stdio.h>
- int main()
- {
- int *p = (int*)calloc(3, 4);
- printf("%d, %d, %d", p[0], p[1], p[2]);
- printf("\n");
- }//这次输出0, 0, 0
3)realloc函数就相对复杂一些:函数原型:void *realloc( void *ptr, size_t size );
功能:先按照size指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后 释放原来ptr所指内存区域,同时返回新分配的内存区域的首地址。
由于该函数会释放原来ptr的空间,所以不用我们去手动free原来的ptr了。
特殊情况的说明:
a. 如果该函数的第一个参数ptr = NULL,那么realloc就于malloc效果一样。
b.如果第二个参数size大小为0,那么释放ptr指向的内存,并返回null,效果与free(ptr)类似。
c.如果没有足够可用的内存用来完成重新分配,则返回null。而原来ptr指向的内存块保持不变。
4)free函数用来释放以上三个函数申请的堆内存空间,使用完堆内存后记得释放,内存泄露就不好了。函数原型
如下:void free( void *ptr );
例3:常见的用法:
- #include <stdlib.h> /* For _MAX_PATH definition */
- #include <stdio.h>
- #include <malloc.h>
- int main( void )
- {
- char *string;
- /* Allocate space for a path name */
- string = (char*)malloc( _MAX_PATH );
- if( string == NULL )
- printf( "Insufficient memory available\n" );
- else
- {
- printf( "Memory space allocated \n" );
- free( string );
- printf( "Memory freed\n" );
- }
- return 0;
- }//_MAX_PATH是stdlib.h中定义的一个宏,代表的文件名的最大长度(260).