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

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

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

为什么要?何时要?

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

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

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

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

如何使用?

  

  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;
  
}

为什么要malloc()?何时要malloc()?如何使用malloc()?的更多相关文章

  1. c语言中的内存分配malloc、alloca、calloc、malloc、free、realloc、sbr

    C语言跟内存分配方式 (1) 从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2) 在栈上创建.在执行函数时,函数内局部变 ...

  2. Linux C 堆内存管理函数malloc()、calloc()、realloc()、free()详解

    C 编程中,经常需要操作的内存可分为下面几个类别: 堆栈区(stack):由编译器自动分配与释放,存放函数的参数值,局部变量,临时变量等等,它们获取的方式都是由编译器自动执行的 堆区(heap):一般 ...

  3. 转:如何实现一个malloc

    如何实现一个malloc 转载后排版效果很差,看原文!   任何一个用过或学过C的人对malloc都不会陌生.大家都知道malloc可以分配一段连续的内存空间,并且在不再使用时可以通过free释放掉. ...

  4. C语言学习017:malloc和free

    malloc和free都包含在<stdlib.h>头文件中 局部变量由于存储在栈中,一旦离开函数,变量就会被释放,当我们需要将数据持久使用,就需要将数据保存到堆中,而在堆中申请内存空间就需 ...

  5. 浅谈malloc()与free()

    malloc()与free() l  函数原型 malloc函数的函数原型为:void* malloc(unsigned int size),它根据参数指定的尺寸来分配内存块,并且返回一个void型指 ...

  6. malloc/free与new/delete的区别

    相同点:都可用于申请动态内存和释放内存 不同点:(1)操作对象有所不同.malloc与free是C++/C 语言的标准库函数,new/delete 是C++的运算符.对于非内部数据类的对象而言,光用m ...

  7. *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏

    *** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...

  8. malloc()参数为0的情况

    问题来自于<程序员面试宝典(第三版)>第12.2节问题9(这里不评价<程序员面试宝典>,就题论题): 下面的代码片段输出是什么?为什么? char *ptr; ))==NULL ...

  9. malloc calloc 和 realloc

    realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc( ...

  10. c语言之内存的申请malloc() 和释放free()

    c语言之内存的申请malloc() 和释放free() 1.如何使用 malloc 函数 malloc是一个函数,专门用来从堆上分配内存.使用malloc函数需要几个要求: 内存分配给谁?分配多大内存 ...

随机推荐

  1. java8 新用法

    /** * 得到优先级最高的集合 * @param list es查询结果 * @return */public List<Group> getMaxPriorityGroup(List& ...

  2. Python 模块Ⅲ

    globals() 和 locals() 函数 根据调用地方的不同,globals() 和 locals() 函数可被用来返回全局和局部命名空间里的名字. 如果在函数内部调用 locals(),返回的 ...

  3. 51 Nod 1134 最长递增子序列(经典问题回顾)

    1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元 ...

  4. codevs 1077 多源最短路x

                         题目描述 Description 已知n个点(n<=100),给你n*n的方阵,a[i,j]表示从第i个点到第j个点的直接距离. 现在有Q个询问,每个询 ...

  5. AHOI/HNOI2017 礼物

    题目链接:戳我 对于题目中给的式子:(大家暂且把\(y_i\)当作\(y_{i+k}\)来看啦qwq) \(\sum_{i=1}^{n}(x_i-(y_i+c))^2\) \(=\sum_{i=1}^ ...

  6. js 获取系统时间:年月日 星期 时分秒(动态)

    最近再写一个纯html页面,有时间和天气的数据,天气后台给接口,时间要自己获取,我就自己弄了下, <div class="basic"></div> 这是放 ...

  7. vue 移动端的开发

    一:cli 的安装: cnpm install -g @vue/cli默认是安装在如下目录:C:\Users\xiaocj\AppData\Roaming\npm\node_modules\@vue ...

  8. 【转】Java压缩和解压文件工具类ZipUtil

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  9. .tcc文件

    今天看源码时碰到一个MemoryPool.h文件和MemoryPool.tcc文件,毫不犹豫在vs工程下把.tcc加到了源文件文件夹下, 把.h文件放到了头文件文件夹下.结果闹了笑话: 以下是解释, ...

  10. LeetCode 3. 无重复字符的最长子串(Longest Substring Without Repeating Characters)

    题目描述 给定一个字符串,找出不含有重复字符的最长子串的长度. 示例: 给定 "abcabcbb" ,没有重复字符的最长子串是 "abc" ,那么长度就是3. ...