malloc函数

malloc 函数其实就是在内存中:找一片指定大小的空间,然后将这个空间的首地址给一个指针变量,这里的指针变量可以是一个单独的指针,也可以是一个数组的首地址, 这要看malloc函数中参数size的具体内容。我们这里malloc分配的内存空间在逻辑上是连续的,而在物理上可以不连续。

malloc:

malloc分配的内存大小至少为size参数所指定的字节数

malloc的返回值是一个指针,指向一段可用内存的起始地址

多次调用malloc所分配的地址不能有重叠部分,除非某次malloc所分配的地址被释放掉

malloc应该尽快完成内存分配并返回(不能使用NP-hard的内存分配算法)

实现malloc时应同时实现内存大小调整和内存释放函数(realloc和free)

头文件:#include <malloc.h>或者#include <alloc.h>两者的内容是完全一样的。

 如果分配成功:则返回指向被分配内存空间的指针。不然,返回空指针NULL。同时,当内存不再使用的时候,应使用free()函数将内存块释放掉。关于:void *,表示未确定类型的指针。C,C++规定,void *类型可以强转为任何其他类型的的指针。

关于void *的其他说法:

         void * p1;

         int *p2;

         p1 = p2;                 就是说其他任意类型都可以直接赋值给它,无需进行强转,但是反过来不可以。

malloc和free函数是配对的,如果申请后不释放就是内存泄露;如果无故释放那就是什么都没有做,释放只能释放一次,如果释放两次及两次以上会出现错误(但是释放空指针例外,释放空指针其实也等于什么都没有做,所以,释放多少次都是可以的

malloc和new

     

     new返回指定类型的指针,并且可以自动计算所需要的大小。

    

      int *p;

      p = new int;   //返回类型为int *类型,分配的大小为sizeof(int)

      p = new int[100];    //返回类型为int *类型,分配的大小为sizeof(int) * 100

    

      而malloc则必须由我们计算字节数,并且在返回的时候强转成实际指定类型的指针。

  

      int *p;

      p = (int *)malloc(sizeof(int));

 

     1,malloc的返回是void *,如果我们写成了: p = malloc(sizeof(int));间接的说明了(将void *转化给了int *,这不合理)

      2,malloc的实参是sizeof(int),用于指明一个整形数据需要的大小,如果我们写成:

            p =  (int *)malloc(1),          那么可以看出:只是申请了一个字节的空间,如果向里面存放了一个整数的话,

            将会占用额外的3个字节,可能会改变原有内存空间中的数据

     3,malloc只管分配内存,并不能对其进行初始化,所以得到的一片新内存中,其值将是随机的。一般意义上:我

           们习惯性的将其初始化为NULL。  

 

上一篇:利用LD_PRELOAD 分析HACK Linux用户态内存使用问题


下一篇:习题10-8 递归实现顺序输出整数 (15 分)