指针和动态存储分配

动态存储分配

程序在运行时需要申请存储空间,用来存放信息,但在编程阶段,我们并不知道程序运行的时候需要多大的空间,也不想事先预留一块非常大的区域,因为其中很多空间也许根本不会用得到。针对这个问题,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操作,引发严重错误。

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

原文地址:https://www.cnblogs.com/WFM1997/p/9617476.html