C里面的内存动态分配函数与存储类别

来源:互联网 发布:淘宝上的棉被 编辑:程序博客网 时间:2024/06/05 18:07

C里面,一共有四个内存动态分配函数,在“stdlib.h“或者在“alloc.h“中定义,分别介绍如下:

(1)     void *calloc(unsigned num, unsigned size),其中,返回值是一个void类型的指针,在Cvoid类型的指针,可以赋值给任意类型的指针,这样,就可以得到任意类型的空间了,其中num参数表示块的多少,size表示每块的大小,其单位是字节,比如用void *calloc(10, sizeofint)可以得到一个10int数的空间。最常用的是 stru *struLP=calloc(2,sizeof(stru))就可以得到两个stru结构体的空间大小了。

(2)     void *malloc(unsigned size),本函数的功能相当于*calloc(1, unsigned size)也就是得到的是一个size大小的内存空间。

(3)     void *realloc(void* buffer, unsigned newsize),本函数会将buffer指针的空间,变为newsize大小,如果newsizeoldsize(用来表示原来buffer的空间大小)大,那么存储区中的内容肯定不变,如果newsizeoldsize小,那么,原先的一些内容将无法保存,调用这个函数之后,buffer的首地址,可能与原先的buffer首地址不一样了。

(4)     void free(void* buffer),本函数将释放buffer所指向的存储区。

C里面一共有三种存储区,分别是静态区(数据段),动态区(堆栈段)以及CPU的通用寄存器区,其中,静态区和动态区都在内存上,而通用寄存器用的是CPU上的空间,C支持四种存储类别,分别是:

(1)     auto:自动类型,存储于计算机的动态存储区,因此,一定都是局部变量,其作用域仅限于函数内,函数运行结束之后,就会自动的释放空间,一般来讲,我们在函数内部定义的时候,都省略auto,而将auto int i;直接写成int i;这是最常用的存储类型。

(2)     registers:寄存器类型,存储于CPU的通用寄存器上,因为位于CPU上,所以,这样类型的变量不能很多,一般不超过2个,一般通用寄存器是16位,所以,超过16位的变量类型,不能使用寄存器类型的存储方式,比如doublefloat等。寄存器类型的变量的使用能够直接于CPU通信,因此,省掉了内存存取的时间,如此,可以提高程序的运行速度。

(3)     static:静态类型,和extern一起,位于静态存储区,static类型的变量,不会因为函数的结束而释放空间,而是一直到程序的结束,static类型的变量,只有在定义的时候进行初始化,如果没有进行初始化,系统会自动初始化,一般初始化为0,而初始化的语句,在初始化之后,都不会再次执行。

(4)     extern:外部类型,也是存储在静态区的变量,这种变量,在函数外部定义,定义的时候,分配内存,在函数中,当碰到extern的时候,系统不会为这个变量分配空间,而是到外部去搜寻这个变量。