static變量與全局、局部變量的差別
全局變量(外部變量)的說明之前再冠以static 就構成了靜态的全局變量。全局變量本身就是靜态存儲方式,靜态全局變量當然也是靜态存儲方式。 這兩者在存儲方式上并無不同。這兩者的差別雖在于非靜态全局變量的作用域是整個源程式,當一個源程式由多個源檔案組成時,非靜态的全局變量在各個源檔案中都是有效的。 而靜态全局變量則限制了其作用域,即隻在定義該變量的源檔案内有效,在同一源程式的其它源檔案中不能使用它。由于靜态全局變量的作用域局限于一個源檔案内,隻能為該源檔案内的函數公用,是以可以避免在其它源檔案中引起錯誤。
從以上分析可以看出,把局部變量改變為靜态變量後是改變了它的存儲方式即改變了它的生存期。把全局變量改變為靜态變量後是改變了它的作用域,限制了它的使用範圍。
static函數與普通函數作用域不同。僅在本檔案。隻在目前源檔案中使用的函數應該說明為内部函數(static),内部函數應該在目前源檔案中說明和定義。對于可在目前源檔案以外使用的函數,應該在一個頭檔案中說明,要使用這些函數的源檔案要包含這個頭檔案
static全局變量與普通的全局變量有什麼差別:static全局變量隻初使化一次,防止在其他檔案單元中被引用;
static局部變量和普通局部變量有什麼差別:static局部變量隻被初始化一次,下一次依據上一次結果值;
static函數與普通函數有什麼差別:static函數在記憶體中隻有一份,普通函數在每個被調用中維持一份拷貝
程式的局部變量存在于(堆棧)中,全局變量存在于(靜态區 )中,動态申請資料存在于( 堆)中。
extern全局變量(用extern修飾的變量隻是說明該變量在其他地方定義,是以在其他地方一定要用明确的定義如int a,并且不能用static修飾)、static全局變量和static局部變量的生存期都是“永久”,差別隻是可見域不同。extern全局變量可見區域是工程,static全局變量可見區域是檔案,而static局部變量的可見區域是塊。
從代碼維護角度來看,對extern變量的修改可能會影響所有代碼,對static全局變量的修改可能影響一個檔案中的代碼,而對static變量的修改可能影響一個塊的代碼;是以在選擇變量類型時,優先級是static局部>static全局>extern全局。但它們有着共同的缺點:使用了這些類型變量的函數将是不可重入的,不是線程安全的。在c/c++标準庫中有很多函數都使用了static局部變量,目前的實作中都為它們提供了兩套代碼,單線程版本使用static變量而多線程版本使用“線程全局變量”,比如rand,strtok等。
一個程序可用記憶體空間為4g,可分在存放靜态資料,代碼,系統記憶體,堆,棧等。.活動記錄一般存放調用參數、傳回位址等内容。堆和棧最大的差別在于堆是由低位址向高位址配置設定記憶體,而棧是由高向低。全局和靜态資料存放在全局資料區,其餘的在棧中,用malloc 或 new 配置設定的記憶體位于堆中。一般來說棧在低位址,堆位于高位址。
原文位址:http://blog.csdn.net/qq_31810357/article/details/50278617