动态存储分配
程序在运行时需要申请存储空间,用来存放信息,但在编程阶段,我们并不知道程序运行的时候需要多大的空间,也不想事先预留一块非常大的区域,因为其中很多空间也许根本不会用得到。针对这个问题,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\n",* 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操作,引发严重错误。
指针类型变量存放的值实际上是内存地址,&取地址操作,*去引用(间接引用)操作