變量未初始化,爲何獲得的值有的是0,有的是隨機值?

要解釋爲何全局變量未初始化爲何是0,而動態局部變量是一個隨機數,就要先弄清楚靜態,動態是什麼,局部,全局又是什麼.而後再思考爲何靜態是0,就要思考它們的存儲方式,所以天然就要了解內存的內部結構,而後瞭解它們的原理,天然就明白了.同時還能就是下初始化和賦值的區別.函數

#初始化和賦值的區別是什麼?.net

  1. 初始化:聲明變量的時候同時賦值,聲明的時候會劃出新的內存區域,同時
  2. 賦值:

#變量的儲存方式:靜態儲存和動態儲存.code

  1. 靜態存儲:變量定義的時候,分配了必定的內存單元,在整個程序中,內存單元都不變.只能初始化一次,能夠屢次賦值,靜態存儲變量不初始化則初始爲0.blog

  2. 動態存儲:程序執行過程當中才分配內存單元,使用完後就釋放,如形參.函數的形式參數就是動態存儲方式,聲明函數的時候不給它分配內存單元.調用的時候傳入實參,就分配內存單元,而後函數執行完後,就釋放內存.動態存儲變量若不初始化,則初始值爲一個隨機數.內存


##怎麼聲明變量的存儲方式?作用域

  1. 全局變量包括全局變量和靜態全局變量,都是靜態存儲,所以未初始值未0,靜態局部變量是靜態存儲,只有動態局部變量是動態存儲.get

  2. 加上static前綴就是靜態存儲變量,如static int a = 0;io

  3. 不加static前綴默認就是動態存儲變量,如int b = 1;(若是是全局變量則因而靜態存儲.)變量


##內存存儲空間的分配:原理

  1. 動態存儲區域:即存儲用動態存儲方式的變量的內存區域,如函數形參,沒有加static前綴的局部變量(即動態局部變量),函數返回地址

  2. 靜態存儲區域:即存儲用靜態存儲方式的變量的內存區域,如全局變量,靜態全局變量.(沒有動態全局變量)

  3. 程序區:存放程序語句.


#變量的做用域:局部和全局.

  1. 全局變量:在全部函數外定義(包含主函數),全部函數均能調用.全局變量都是靜態存儲,沒初始化時默認爲0;

  2. 局部變量:函數內部定義,只適用於當前函數.沒初始化時,如果靜態存儲,則爲0,如果動態存儲,則爲隨機值.

#靜態全局變量和全局變量的區別?

  1. 注意,它們都是靜態存儲,不存在動態存儲變量.主要是做用域不一樣.靜態全局變量只適用於當前文件,初始值爲0;
  2. 而全局變量能夠extern在其餘文件使用.若同時出現兩個相同變量名的不一樣類型變量,做用域小的起做用.初始值也爲0;

#靜態局部變量和(動態)局部變量的區別?

  1. 做用域相同,但內存釋放週期不一樣.動態局部變量當函數執行結束後,就釋放內存.下次在調用時又能夠對其初始化.初始值爲隨機數.

  2. 而靜態局部變量則在整個程序中都不會釋放內存,下一次調用時仍是上一次的值.初始值爲0;


#爲何靜態存儲未初始化時,初始值爲0,而動態則爲一個隨機數?

https://www.zhihu.com/question/49111720
https://blog.csdn.net/u010191034/article/details/39124505

相關文章
相關標籤/搜索