zoukankan      html  css  js  c++  java
  • 指针和动态存储分配

    动态存储分配

    程序在运行时需要申请存储空间,用来存放信息,但在编程阶段,我们并不知道程序运行的时候需要多大的空间,也不想事先预留一块非常大的区域,因为其中很多空间也许根本不会用得到。针对这个问题,C语言提供了一套机制可以在程序运行时分配存储空间,这块区域成为系统堆(heap)。可以调用malloc函数申请所需大小的一块内存空间。如果当前系统存在空内存,则函数malloc返回指向这块内存起始地址的指针,反之,则返回指针NULL。如果不再用这块存储空间时要记得free释放掉,交还给系统

    int i,*pi;
    float f,*pf;
    pi=(int *)malloc(sizeof(int));
    pf=(float *)malloc(sizeof(float));
    * pi=1024;
    * pf=3.14;
    printf("an_integer=%d,a_float=%f
    ",* pi,* pf);
    free(pi);
    free(pf);

    如果存储空间不足,调用malloc会使申请失败,用一下代码替换上述malloc相应代码

    if((pi=(int *)malloc(sizeof(int)))==NULL) || (pf=(float *)malloc(sizeof(float)))==NULL){
      fprintf(stderr,"Insufficient_memory");
      exit(EXIT_PAILURE);
    }

     或者使用以下等价的代码

    if(!(pi=(int *)malloc(sizeof(int))) || !(pf=(float *)malloc(sizeof(float)))){
      fprintf(stderr,"Insufficient_memory");
      exit(EXIT_FAILURE);
    
    }

    经常使用malloc的话,可以定义宏语句,如下

    #define MALLOC(p,s)
      if(!(p)=malloc(s))){
              fprintf(stdeerr,"Insufficient_memory");
              exit(EXIT_FAILURE);
    }

    则可以直接调用了

    MALLOC(pi,sizeof(int));
    MALLOC(pf,sizeof(float));

    指针隐患

    C程序中让所有尚未指向实际目标的指针都取NULL值,可以尽量避免访问一块尚未申请的空间,或访问一块我们并无权访问的空间。有些计算机在涉及空指针操作时,返回NULL,能够接着执行,而另一些系统,将直接对地址单元0操作,引发严重错误。

    指针类型变量存放的值实际上是内存地址,&取地址操作,*去引用(间接引用)操作 

  • 相关阅读:
    Python学习笔记模式匹配与正则表达式之使用和不使用正则表达式
    关于Jqury的一些杂碎
    客户端验证模型
    导航(摘)
    解决了DIV+CSS一个问题
    购买了新书《Bootstrap用户手册—设计响应式网站》及简介Bootstrap是什么
    博客园的博客页面开通了,今天!
    利用Cmake 将最新版本OBS编译成windows版本。
    C语言无法使用引用,一定要使用怎么办? ------指针的指针做参数
    linux core文件的打开和分析
  • 原文地址:https://www.cnblogs.com/WFM1997/p/9617476.html
Copyright © 2011-2022 走看看