C变量和函数的存储类型
在上一篇《C程序内存管理》的文章中,已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为。
auto只能用来表示变量的存储类型,意味自动类型,表示该局部变量存储在运行时进程的栈区域,一般而言,对于局部变量、auto为默认的存储类型。所以可以省略不写。注意,局部变量如果没有初始化就直接拿来使用,那么系统会随机的分配一个值给它,这是不安全的。auto类型的变量每一次调用都会被初始化一次。
extern既可以声明变量也可以标识函数。对于用来声明变量,extern声明在当前文件中引用的定义在其它文件中的全局变量。已经初始化的全局变量被存储在数据区中,所以声明其他文件中的全局变量将不会在为其分配内存空间。声明一个变量和定义一个变量的区别:定义一个变量:告诉编译器需要为该变量分配多少空间。声明一个变量:告诉编译器需要使用该变量,但该变量在其他位置被定义。对于一个函数,存储类型仅仅标识函数的作用域,默认的存储类型是extern。声明全局变量的两种方式:1、在头文件中定义,然后引用头文件2、在其他文件中定义,然后使用extern引用变量。
register关键字只能定义局部变量,只能修饰整形或者字符型,主要表示长期被使用的变量。被register定义的局部变量长期存在于寄存器中,寄存器变量被用于循环控制是比较理想的。和auto一样,如果未初始化就直接使用register变量,那么系统讲随机分配一个变量。
static既可以标识变量也可以标识函数。被定义为静态类型的变量(无论是全局的变量、还是局部变量)都存储在数据区域,其生命周期为整个程序。如果是静态的局部变量,其作用域为自身所处的{ }内,如果是静态全局变量,其作用域为整个当前文件。静态变量如果没有被初始化,系统讲自动初始化为0值,只会被初始化一次。static定义的函数的作用域只能是当前文件,因此不能在其他文件中被调用。对于不需要在其他文件中被调用的函数,声明为static是必要的,这样也在一定程度上避免函数名称的冲突。
常量数据存储在代码段,其生存期为整个程序的运行时间,但是其作用域为当前文件。
原文地址:http://blog.csdn.net/diaorenxiang/article/details/39736087