C语言变量的类型和存储位置

  • Post author:
  • Post category:其他


1. C语言变量主要分为全局变量、静态全局变量、局部变量、静态局部变量和寄存器变量。其中静态变量用static关键字进行修饰。程序所占用的内存可以分为以下几个部分:

(1)代码段-存放程序代码,只读的,不能修改。

(2)全局区(静态区),又称为数据段。其中.data段存放的是已经初始化的全局变量和静态变量(静态全局变量和静态局部变量)。.bss段存放的是未初始化的全局变量和静态变量(静态全局变量和静态局部变量)。bss段会将未初始化的变量填充为0.

(3) 堆: 是一种线性结构,类似链表实现,也可由其它方法实现。malloc, realloc函数一般从堆上分配内存。注意:和数据结构中的堆不同。

(4) 栈: 后进先出结构。主要存储的是局部变量,函数形参,以及函数地址。

(5)常量区:存储字符串常量。

2. 变量的生存期和作用域

全局变量: 全局变量的作用域是整个源程序,即多个文件中有效。通过extern声明。

静态全局变量: 静态全局变量和全局变量的存储域是相同的,都存储在数据段。但作用域不相同,用static声明的静态全局变量作用域被限制在本文件内。在文件外是无效的。函数或变量前加static,可防止命名冲突。

局部变量: 局部变量是定义在函数体内的,当函数执行结束后,就自动释放。作用域为整个函数体。

静态局部变量: 与局部变量不同的是,它存储在全局区或是静态区,局部变量存储在栈上。静态局部变量的作用域也是函数体,函数体外无效。但当函数执行完之后,静态局部变量一直存在,下次调用时可以直接利用上次保存的值,即静态局部变量就初始化1次,不会重复初始化。

如果在头文件声明了静态变量,那么每个包含该头文件的源文件中的静态变量地址都是不相同的,即视为不相同的变量,这样可以防止变量重定义。也说明了静态全局变量将作用域限制在了文件内。

3. 可以通过readelf -a 可执行文件,查看每个段情况。



版权声明:本文为chenjin_zhong原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。