码迷,mamicode.com
首页 > 其他好文 > 详细

C变量和函数的存储类型

时间:2014-10-02 14:51:23      阅读:206      评论:0      收藏:0      [点我收藏+]

标签: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、常量数据

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

bubuko.com,布布扣



C变量和函数的存储类型

标签:c   存储   

原文地址:http://blog.csdn.net/diaorenxiang/article/details/39736087

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!