***************************************************
更多精彩,歡迎進入:http://shop115376623.taobao.com
***************************************************
1. C語言變量主要分為全局變量、靜態全局變量、局部變量、靜態局部變量和寄存器變量。其中靜態變量用static關鍵字進行修飾。程序所占用的內存可以分為以下幾個部分:
(1)代碼段-存放程序代碼,只讀的,不能修改。
(2)全局區(靜態區),又稱為數據段。
其中.data段存放的是已經初始化的全局變量和靜態變量(靜態全局變量和靜態局部變量)。.
? ? ? ? ?bss段存放的是未初始化的全局變量和靜態變量(靜態全局變量和靜態局部變量)。bss段會將未初始化的變量填充為0.
(3)堆: 是一種線性結構,類似鏈表實現,也可由其它方法實現。malloc, realloc函數一般從堆上分配內存。注意:和數據結構中的堆不同。
(4)棧: 后進先出結構。主要存儲的是局部變量,函數形參,以及函數地址。
(5)常量區:存儲字符串常量。
2. 變量的生存期和作用域
全局變量: 全局變量的作用域是整個源程序,即多個文件中有效。通過extern聲明。
靜態全局變量: 靜態全局變量和全局變量的存儲域是相同的,都存儲在數據段。但作用域不相同,用static聲明的靜態全局變量作用域被限制在本文件內。在文件外是無效的。函數或變量前加static,可防止命名沖突。
局部變量: 局部變量是定義在函數體內的,當函數執行結束后,就自動釋放。作用域為整個函數體。
靜態局部變量: 與局部變量不同的是,它存儲在全局區或是靜態區,局部變量存儲在棧上。靜態局部變量的作用域也是函數體,函數體外無效。但當函數執行完之后,靜態局部變量一直存在,下次調用時可以直接利用上次保存的值,即靜態局部變量就初始化1次,不會重復初始化。
如果在頭文件聲明了靜態變量,那么每個包含該頭文件的源文件中的靜態變量地址都是不相同的,即視為不相同的變量,這樣可以防止變量重定義。也說明了靜態全局變量將作用域限制在了文件內。
3. 可以通過readelf -a 可執行文件,查看每個段情況。