为何要malloc()?什么时候要malloc()?如何使用malloc()?

  今日写程序,忽然想到一个问题,为何有时候不要malloc,为何有时候要呢!好好查资料才了解到一些原理。函数

  函数原型:void *malloc(unsigned int num_bytes);  //分配长度为num_bytes字节的内存块spa

  返回值是void指针,void* 表示未肯定类型的指针,void *能够指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(好比是char仍是int或者其余数据类型),能够经过类型强制转化转化为其余任意类型指针。若是分配成功则返回指向被分配内存的指针(此存储区中的初始值不肯定),不然返回空指针NULL。指针

为何要?什么时候要?code

  malloc()是动态内存分配函数,用来向系统请求分配内存空间。当没法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。由于malloc只管分配内存空间,并不能对分配的空间进行初始化,因此申请到的内存中的值是随机的,常常会使用memset()进行置0操做后再使用。  内存

  与其配套的是free()当申请到的空间再也不使用时,要用free()函数将内存空间释放掉,这样能够提升资源利用率,最重要的是----就是由于它能够申请内存空间,而后根据须要进行释放,才被称为“动态内存分配”!     资源

  malloc()函数实质体如今,它有一个能够将可用内存块链接成一个长长的列表的链表,这个链表就是所谓的空闲链表。调用malloc()函数时,它沿着链接表寻找一个大到能够知足用户请求要求的连续的内存块,而后将内存块一分为二,一块的大小与用户请求的内存大小相等,另外一块就是剩下的内存块。接下来,它将用户申请的那块传递给用户,将另外一块返回到链接表上(若是另外一块有的话)。 原型

  调用free()函数的时候,它将用户想要释放的内存块连接到空闲链上。咱们能够想到,最后的空闲链连接的内存空间一小块一块的块,若是这是用户申请分配一个较大的内存空间,那么空闲链上可能没有符合用户要求的内存块了,这个时候,malloc()函数请求延时,并开始在空闲链上翻箱倒柜的检查各内存块,对他们进行整理,将相邻的小内存块合并成较大的内存块。若是没法得到符合用于要求的内存空间,那么malloc()函数就会返回NULL,所以,调用malloc()函数的时候,必定要判断它的返回值是否为NULL。string

 

如何使用?io

  

  int  *p;
  p = ( int *) malloc ( sizeof ( int ) * 128);
    //分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
  double  *pd = ( double *) malloc ( sizeof ( double ) * 12);  
    // 分配12个double型存储单元,并将首地址存储到指针变量pd中
  free(p);
  free(pd);
  p = NULL;
  pd = NULL;  
  指针用完赋值NULL是一个很好的习惯。
 
内存泄漏:
例:  
#include <stdio.h>
#include <malloc.h>
#define MAX 1000000
 
int  main( void )
{
     int  *a[MAX] = {NULL};
     int  i;
     for (i=0;i<MAX;i++)
     {
       a[i]=( int *) malloc (MAX);  //此处没有判断返回值
     }
     return  0;
}
 
例:
#include "stdio.h"
 
#include "malloc.h"//malloc()函数被包含在malloc.h里面
 
 
int  main( void )
{
 
     char  *a = NULL; //声明一个指向a的char*类型的指针
         
     a = ( char *) malloc (100* sizeof ( char )); //使用malloc分配内存的首地址,而后赋值给a
 
     if (!a) //若是malloc失败,能够获得一些log,  此处返回条件判断错误,应为:if(NULL == a)
         
     {
         perror ( "malloc" );
         return  -1;
     }
 
     sprintf (a, "%s" , "HelloWorld\n" ); //"HelloWorld\n"写入a指向的地址
     
     printf ( "%s\n" ,a);
     
     free (a); //释放掉使用的内存地址
 
     return  0;
  
}
相关文章
相关标签/搜索