要解釋為什么全局變量未初始化為什么是0,而動態局部變量是一個隨機數,就要先弄清楚靜態,動態是什么,局部,全局又是什么.然后再思考為什么靜態是0,就要思考它們的存儲方式,因此自然就要了解內存的內部結構,然后了解它們的原理,自然就明白了.同時還能就是下初始化和賦值的區別.
初始化和賦值的區別是什么?
- 初始化:聲明變量的時候同時賦值,聲明的時候會划出新的內存區域,同時
- 賦值:
變量的儲存方式:靜態儲存和動態儲存.
-
靜態存儲:變量定義的時候,分配了一定的內存單元,在整個程序中,內存單元都不變.只能初始化一次,可以多次賦值,靜態存儲變量不初始化則初始為0.
-
動態存儲:程序執行過程中才分配內存單元,使用完后就釋放,如形參.函數的形式參數就是動態存儲方式,聲明函數的時候不給它分配內存單元.調用的時候傳入實參,就分配內存單元,然后函數執行完后,就釋放內存.動態存儲變量若不初始化,則初始值為一個隨機數.
怎么聲明變量的存儲方式?
-
全局變量包括全局變量和靜態全局變量,都是靜態存儲,因此未初始值未0,靜態局部變量是靜態存儲,只有動態局部變量是動態存儲.
-
加上static前綴就是靜態存儲變量,如
static int a = 0;
-
不加static前綴默認就是動態存儲變量,如
int b = 1;
(如果是全局變量則於是靜態存儲.)
內存存儲空間的分配:
-
動態存儲區域:即存儲用動態存儲方式的變量的內存區域,如函數形參,沒有加static前綴的局部變量(即動態局部變量),函數返回地址
-
靜態存儲區域:即存儲用靜態存儲方式的變量的內存區域,如全局變量,靜態全局變量.(沒有動態全局變量)
-
程序區:存放程序語句.
變量的作用域:局部和全局.
-
全局變量:在所有函數外定義(包含主函數),所有函數均能調用.全局變量都是靜態存儲,沒初始化時默認為0;
-
局部變量:函數內部定義,只適用於當前函數.沒初始化時,若是靜態存儲,則為0,若是動態存儲,則為隨機值.
靜態全局變量和全局變量的區別?
- 注意,它們都是靜態存儲,不存在動態存儲變量.主要是作用域不同.靜態全局變量只適用於當前文件,初始值為0;
- 而全局變量可以extern在其他文件使用.若同時出現兩個相同變量名的不同類型變量,作用域小的起作用.初始值也為0;
靜態局部變量和(動態)局部變量的區別?
-
作用域相同,但內存釋放周期不同.動態局部變量當函數執行結束后,就釋放內存.下次在調用時又可以對其初始化.初始值為隨機數.
-
而靜態局部變量則在整個程序中都不會釋放內存,下一次調用時還是上一次的值.初始值為0;
為什么靜態存儲未初始化時,初始值為0,而動態則為一個隨機數?
https://www.zhihu.com/question/49111720
https://blog.csdn.net/u010191034/article/details/39124505