C语言变量和函数的存储类型

C变量和函数的存储类型

在上一篇《C程序内存管理》的文章中(),已经知道了C语言编译后的可执行文件的存储结构以及运行时的内存布局,本文则记录C语言中变量和函数的存储类型,以及在内存中的一些行为。

C语言中变量的声明/定义格式如下:

存储类型    类型修饰符    数据类型    变量名;

存储类型:用来指明变量的存储位置,即运行该变量在哪一段分配内存空间,常见的存储位置有auto、extern、register、static,在一段执行程序中,可以为变量分配存储空间的有BSS、数据区、栈区、堆区。

类型修饰符:用来修饰变量的存储和表现方式。包括long、short、signed、unsigned、void、const、volatile等。

数据类型:用来指明该变量的存储大小,即一个该类型的变量要占用多少内存空间。基本数据类型有(char、int、float、指针类型)和由基本数据类型组成的用户自定义类型(struct、enum、typedef、union)

C语言中函数的声明格式如下:

存储类型    返回数据类型    函数名(参数列表)

存储类型:用来标识该函数的作用域,而不是存储位置,主要有extern、static两个,auto和register不用来表示程序的存储类型。

返回数据类型:函数退出时返回给调用者的数据类型。

1、关于auto存储类型

auto只能用来表示变量的存储类型,意味自动类型,表示该局部变量存储在运行时进程的栈区域,一般而言,对于局部变量、auto为默认的存储类型。所以可以省略不写。注意,局部变量如果没有初始化就直接拿来使用,那么系统会随机的分配一个值给它,这是不安全的。auto类型的变量每一次调用都会被初始化一次。

2、关于全局变量和extern声明的数据

extern既可以声明变量也可以标识函数。对于用来声明变量,extern声明在当前文件中引用的定义在其它文件中的全局变量。已经初始化的全局变量被存储在数据区中,所以声明其他文件中的全局变量将不会在为其分配内存空间。

声明一个变量和定义一个变量的区别:

定义一个变量:告诉编译器需要为该变量分配多少空间。

声明一个变量:告诉编译器需要使用该变量,但该变量在其他位置被定义。

对于一个函数,存储类型仅仅标识函数的作用域,默认的存储类型是extern。

声明全局变量的两种方式:

1、在头文件中定义,然后引用头文件

2、在其他文件中定义,然后使用extern引用变量。

3、register存储类型

register关键字只能定义局部变量,只能修饰整形或者字符型,主要表示长期被使用的变量。被register定义的局部变量长期存在于寄存器中,寄存器变量被用于循环控制是比较理想的。和auto一样,如果未初始化就直接使用register变量,那么系统讲随机分配一个变量。

4、static存储类型

static既可以标识变量也可以标识函数。被定义为静态类型的变量(无论是全局的变量、还是局部变量)都存储在数据区域,其生命周期为整个程序。如果是静态的局部变量,其作用域为自身所处的{ }内,如果是静态全局变量,其作用域为整个当前文件。

静态变量如果没有被初始化,系统讲自动初始化为0值,只会被初始化一次。

static定义的函数的作用域只能是当前文件,因此不能在其他文件中被调用。对于不需要在其他文件中被调用的函数,声明为static是必要的,这样也在一定程度上避免函数名称的冲突。

5、常量数据

常量数据存储在代码段,其生存期为整个程序的运行时间,但是其作用域为当前文件。

C语言变量和函数的存储类型

C++ 隐式类类型转化 Implicit Class-Type Conversions

C语言变长数组之剖析

C语言需要注意的问题

C语言位域的使用及其注意点

C语言中简单的for循环和浮点型变量

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/ec5237fc4e5a18123e7da10200fb77b6.html