在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不初始                                    化,里边数据是随机的垃圾数据。

    可以写一个小程序测试一下:

  1. //malloc测试: 
  2. #include <stdlib.h> 
  3. #include <stdio.h> 
  4. int main() 
  5.     int *p = (int*)malloc(12); 
  6.     printf("%d, %d, %d", p[0], p[1], p[2]); 
  7.     printf("\n"); 
  8. }//在我机器上输-842150451, -842150451, -842150451 
  9.  
  10. //calloc测试 
  11. #include <stdlib.h> 
  12. #include <stdio.h> 
  13. int main() 
  14.     int *p = (int*)calloc(3, 4); 
  15.     printf("%d, %d, %d", p[0], p[1], p[2]); 
  16.     printf("\n"); 
  17. }//这次输出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:常见的用法:

  1. #include <stdlib.h> /* For _MAX_PATH definition */ 
  2. #include <stdio.h> 
  3. #include <malloc.h> 
  4.  
  5. int main( void ) 
  6.     char *string; 
  7.     /* Allocate space for a path name */ 
  8.     string = (char*)malloc( _MAX_PATH ); 
  9.     if( string == NULL ) 
  10.         printf( "Insufficient memory available\n" ); 
  11.     else 
  12.     { 
  13.             printf( "Memory space allocated \n" ); 
  14.         free( string ); 
  15.         printf( "Memory freed\n" ); 
  16.     } 
  17.     return 0; 
  18. }//_MAX_PATH是stdlib.h中定义的一个宏,代表的文件名的最大长度(260).