變量未初始化,為什么得到的值有的是0,有的是隨機值?


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

初始化和賦值的區別是什么?

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

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

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

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


怎么聲明變量的存儲方式?

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

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

  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM