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 是互相排斥的。