第8章 变量的存储类型
自动变量(局部变量)
函数内部定义的变量被称为自动变量,用关键字auto表示
一般使用的都是自动变量,auto int x; 相当于 int x;
作用域局限于函数之内,当函数被调用时,在栈区为其分配内存空间,生命期在函数调用期间
形参也是自动变量
所有函数共享栈,所以函数结束后,自动变量无法保持其值
在C语言中,自动变量没有默认初值
外部变量(全局变量)
在函数外部定义的变量称为外部变量,关键字extern表示
生命期和作用域为全局,被存放在内存的全局数据区,生命期为程序的整个执行期间
默认初值为0
一个外部变量通常要经过 定义变量 和 说明变量 后才能使用
使用外部变量时,应当在函数内作引用说明,即extern int a; a=100;
如果在同一个源程序文件内,则可以省略引用说明,直接 a=100;
意味着,不同文件可以互相调用外部变量,但是必须作引用说明
命名重复时,自动变量会屏蔽外部变量
静态变量
static int number;
编译程序会为静态变量分配一个固定的数据区存储空间,其存储特点(生命期、初始化等)与外部变量相同;
值在整个程序的运行期间都被保留
初始化为0
静态变量又分为内部静态变量和外部静态变量
内部静态变量作用域与自动变量相同,区别在于前者可以保留上一次的值供下一次调用使用;全局生命期,局部作用域;

外部静态变量与外部变量差别在于,前者只对本源程序文件有效,对其他文件无需,后者对所有文件都有效;
可以将函数定义为静态函数,使得其作用域仅限于本源程序文件内
![]()
寄存器变量
register int x;
目的:提高经常使用的变量的存取速度
实质:编译程序将变量存放在CPU寄存器中,而不放在内存中
限制:由于寄存器长度的限制,寄存器变量只能用于整型(位长度不能超过寄存器位长度)和字符型;
寄存器变量的数目收到机器类型的限制,多的寄存器变量将被自动转换成自动变量;因此寄存器变量的定义是一个请求,而不是命令;
寄存器变量无初值,可以作形参
void func(static int a); 报错
void func(register int a); 通过
外部和静态只一次初始化;局部和寄存器每调用一次函数都初始化一次;
动态内存分配函数
两种内存分配方式
静态分配:上述四种,预先分配一次内存,运行过程中不能变动,预先确定大小;
动态分配:堆中进行;优点:1、程序运行的不同阶段,同一内存能为程序的不同部分服务;2、允许建立链表;
常用动态分配函数
1、malloc(size):分配大小为size字节的内存空间
原型:void malloc(unsigned size);
返回值是无类型的指针,所以需要强制转换;
2、calloc(n, size):分配n个具有size字节的内存空间
3、realloc(ptr, size):改变已分配的存储空间
4、free(ptr):释放由指针访问的存储空间
原型:void free(void *ptr);
放在stdlib.h中
例:程序检查内存中自由存储空间的大小


浙公网安备 33010602011771号