1. Now we study linux compile, we found that when we use "readelf -S" we can read the symbol in the exe.
我们会发现在 在程序中会有 data bss text 和 read data 以及 heap stack 等段的概念。下面我们详细的讲一下个段的存放的那些变量。
text 段: 存放的是指令 为只读的 不可在运行是 改变 --- 占用code size的大小
data 段: 存放 初始化的全局变量 初始化为0和NULL的除外(包括 初始化的静态全局变量) 和 初始化的 局部静态变量 -- 占用code size
bss 段: 存放 未初始化的全局变量(包括初始化成0 NULL)和 未初始化的 局部静态变量。 --不占用code size 他只进路所有bss的总的大小。在程序运行时 reserve 这麽大的 空间。
字符串常量: 一般存放在text 段
read data 段: 在data段中 只不过存放的是常量数据。
下面我们讲一下static 修饰符的作用。
static 作用:
1. 改变 变量的存储区(从 stack 上提到 bbs 或者data 段) 在局部变量上加一个static 修饰符就是这个作用。 虽然这个变量的作用域 还是在这个 局部区域 但当这个作用与失效时 这个变量的值依然存在(符号已经被注销了)。
例如:
void test1(void)
{
static int a = 9;
int b = 8;
// 虽然在test1 调用结束后, 符号 a,和符号 b 都不在符号表里了。但是a 的这个值9 还存在。 这就函数返回值的引用。
}
2. 限制作用域 加上 static 的全局变量 的作用与就不是全工作目录 就变成的定义他的文件又有效了。
static int a;
int c;
void test()
{
}
a 就只有在这个文件有效。
c 可以全工程有效。
注意static 和extern 是相互排斥的。