全域性常量 全域性變數和常量在記憶體中的分布

2021-10-16 03:51:56 字數 2432 閱讀 7153

元旦快樂

記憶體結構

memory  structure

記憶體中,有**段,資料段,棧,堆。資料段分為已初始化和未初始化。

記憶體中屬性很多,但作為程式設計師,只重點關注讀(read),寫(write),執行(execyte),共享(share),這四個屬性。英語取開頭字母,縮寫為rwes。

**段放程式的**,屬性是可讀可執行。

資料段放全域性資料,靜態資料和常量。未初始化部分,屬性是可讀寫。已初始化部分,分兩部分,一部分屬性是可讀寫,一部分屬性是唯讀。

棧放引數,區域性變數,儲存的環境和返回位址,屬性是可讀寫。

堆的屬性是可讀寫。

這裡的屬性是初始狀態,在程式執行過程中,作業系統有一定的機制可以調整屬性。

全域性變數和常量的記憶體分布

memory distribution for global variables and constants

游離在其他函式以外,定義的變數,叫做全域性變數。全域性變數可以被所有函式同時訪問。

編寫程式:

#include #include int g_ntest1 = 0x53801204;int g_ntest2 = 0x41201314;void foo()int main()
按 f10 進行單步除錯,可以看到 ntest 的位址是 0019ff2c

g_ntest1 的位址是 00429098 ,g_ntest2 的位址是 0042909c。兩個是相鄰的。

由此可見,編譯器分配變數的原則:按同記憶體屬性型別分配

在原有**中,定義乙個字串 hello

#include #include int g_ntest1 = 0x53801204;char g_szhello = "hello";int g_ntest2 = 0x41201314;void foo()int main()
按 f10 進行單步除錯,從記憶體結構可以看出,雖然資料型別不一致,有 int 型別,有字串。但是它們都是已初始化的全域性資料,所以分配的空間是連續的。

將**中的 g_ntest2 的初值去掉

#include #include int g_ntest1 = 0x53801204;char g_szhello = "hello";int g_ntest2;void foo()int main()
因為 g_ntest1 和 g_szhello 是已初始化全域性資料,而 g_ntest2 是未初始化全域性資料,所以 g_ntest1 和 g_szhello 連續放在已初始化全域性資料區,g_ntest2 獨自放在未初始化全域性資料區。

按 f10 進行單步除錯,g_ntest1 的位址是 00426a30 。g_szhello 的位址是 00426a34,和 g_ntest1 是連續排列的。而 g_ntest2 的位址卻是 00429e60。

新增常量 g_ntest = 0x13145201 在**中

#include #include int g_ntest1 = 0x53801204;char g_szhello = "hello";int g_ntest2;const int g_ntest = 0x13145201void foo()int main()
按 f10 進行單步除錯,可見,初始化全域性資料在乙個記憶體空間,未初始化全域性資料在乙個記憶體空間,常量在乙個記憶體中間。

2 全域性變數和列舉常量

首先我們要定義一些excel物件變數 如本文第一部分所示,用來繪製圖表的資料原來儲存在sql資料庫,後來以記錄集物件的形式傳遞。資料首先儲存到這裡的工作表,然後又被傳遞給oexcelchart物件。oexcelchart物件是ms excel的chart物件,幫助檔案說它 代表工作簿中的圖表。該圖表...

魔術常量,超全域性變數

魔術常量 line 在源 中插入當前源 行號 file 在原始檔中插入當前源檔名 date 在原始檔中插入當前的編譯日期 time 在原始檔中插入當前編譯時間 method method 是php5之後新增的魔術常量,表示的是類文法的名稱 function 返回函式名稱 php4.3.0 新加 自p...

PHP中全域性變數和超全域性變數

自定義全域性變數的作用域為當前的指令碼檔案的任意位置 函式或者方法啊之類的 但是要想用它們必須先執行一下 global variable語句 variable為要使用的全域性變數 或者是使用 global 變數名字 來呼叫。超全域性變數作用於也是為當前的指令碼檔案的任意位置,在使用的時候無需先執行 ...