《初探內存模型》word版_第1頁
《初探內存模型》word版_第2頁
《初探內存模型》word版_第3頁
《初探內存模型》word版_第4頁
《初探內存模型》word版_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、.關于內存模型自己的幾點理解:我們可以把計算機的內存看成是一個帶有很多格子的一個很長的容器(如下)他們是連續編號的,當然至于是從大到小還是從小到大依據機器而定(所謂的大端和小端)第一個問題:#include<stdio.h>int main(void)int a=0;int b=0;int c=0;printf("%d,%d,%d n",&a,&b,&c);return 0;思考一下 輸出的結果是什么?代表什么意思?運行的結果是:1245052 1245048 1245044這些數據代表的是什么呢?是首地址!也就是a在內存模型中的首地址是

2、1245052 b的是1245048 c的是1245044我們假設現在的內存模型是這個樣子的1245055124505412450531245052124505112450501245049124504812450471245046為了方便表示,將內存編號簡寫一下:555453525150494847464544434241403938紅色表示a在內存中存放位置黑色表示b在內存中存放的位置藍色表示c在內存中存放的位置解釋幾個問題:1, 內存的最小單位是字節,一個字節占8位,這就是為什么char的最大值是255.這句話的深層含義是我們的方格還可以再分,他可以分成8份。2, 為什么先定義的內空間的

3、內存編號比后定義的大?這是因為這些變量時定義在棧段的,棧指針從大到小。(這是我自己根據匯編的理解,望高手斧正,感激不盡!)3, 為什么a在內存中占4個字節?我們知道int占2個字節,但不同的編譯器可能會不同,書本上都有介紹的。我用的vc6.0,int 占4個字節4, 你怎么知道內存的高位在編號大的地方?這個問題不必深究,這和機器有關,就是所謂的大端小端第二個問題:#include<stdio.h>int main(void)int a=0;int b=0;int c=0;printf("%d,%d,%d n",&a,&b,&c);int

4、k=0;k=(int)&a;printf("k=%d n",k);printf("*k=%d n",*(int *)k);return 0;運行的結果如下:解釋幾個問題:1, k=(int)&a;為什么要強制轉換?這是因為&a的類型和k的類型不匹配,雖然&k輸出的是一個數字,但是他的類型是未定義的,所以我們需要強制轉換2, 我們發現輸出的是k=1245052,也就是a在內存中存放的首地址。我認為內存的編號和內存是一一對應的也就是一個內存空間,只能有一個編號。因此我猜想能不能通過內存編號來找到內存中的值呢?3, *k=0,說

5、明我們成功的提取出了內存中的a的值,(也許你認為k=0不一定是a的值,你可以實驗任何一個值,發現我的結果是對的)。注意這里的結論:內存編號和內存是一一對應的,我們可以通過內存的編號去訪問該內存中的值,而不需要通過變量名為了說明上面的結論,給一個更加直接的例子:#include<stdio.h>int main(void)int a=8;int b=0;int c=0;printf("%d,%d,%d n",&a,&b,&c);int k=0;k=(int)&a;printf("k=%d n",k);printf

6、("*k=%d n",*(int *)k);printf("a=%d n",*(int *)1245052);return 0;運行的結果是:第三個問題:現在這里給出一個結論:C語言提取內存數據的機制可能是:首先找到變量在內存中的首地址,然后找到他在內存中所占空間的大小,也就是字節數。最后得出該變量的值。具體來說:首先找到a在內存中的首地址(1245052),然后因為a的類型是int所以編譯器會從首地址出發找到四個字節的空間,提取出這四個字節中的值(8)作為a的值。#include<stdio.h>int main(void)int a=99

7、;int b=0;printf("%d,%d n",&a,&b);int k=0;k=(int)&a;printf("k=%d n",k);printf("*k=%d n",*(int *)k);printf("*k=%c n",*(char *)k);return 0;運行的結果是:解釋幾個問題:1,*(int *)k 是什么意思? k代表的內存的首地址,為什幺強制轉換?根據我們上面的理論,我們要在內存中提出一個值,需要兩個條件,一個是首地址,一個是長度。K提供了首地址,那么自然int 就

8、提供了長度。也即是,這句話告訴編譯器,我們要從k為首地址的地方,提取4個字節的變量值(int),所以*k的值是992,*(char *)k的意思同上,只是這次的長度為1了。所以輸出為:(ASSIC碼 97)c看一下內存模型:555453525150494847464544434241403938_這四個字節表示a *(int *)1245052_這一個字節表示*(char *)1245052 (下劃線表示內存中的字節數)第四個問題:內存編號為1245053這個字節中內容為多少呢?#include<stdio.h>int main(void)int a=99;int b=0;prin

9、tf("%d,%d n",&a,&b);int k=0;k=(int)&a;printf("k=%d n",k);printf("*k=%d n",*(int *)k);printf("*k=%c n",*(char *)k);printf("*k=%d n",*(char *)(k+1);return 0;輸出結果為:解釋幾個問題:1, printf("*k=%d n",*(char *)(k+1);這表示我們要提取內存首地址編號為k+1,長度為1內

10、存中的值2, 最后輸出的結果為0,說明該內存單元的值此時為0我們看一下內存模型:555453525150494847464544434241403938a的值為99,從高到低存放。a占4個字節,那么此時的內存情況是這樣的55545352 (字節)00000000000000000000000001100011很明顯99只用一個字節就可以存儲,那么第二個字節自然就是0了,這就是為什么*(char *)(k+1)的結果為0也許你還不是很確定結論的正確性,看下面的例子:#include<stdio.h>int main(void)int a=257;int b=0;printf(&quo

11、t;%d,%d n",&a,&b);int k=0;k=(int)&a;printf("k=%d n",k);printf("*k=%d n",*(int *)k);printf("k0=%d n",*(char *)k);printf("k1=%d n",*(char *)(k+1);printf("k2=%d n",*(char *)(k+2);printf("k3=%d n",*(char *)(k+3);return 0;運行的結果:

12、依照上面的理論來分析運行的結果:當a為257時的內存模型狀態:55545352 (字節)00000000000000000000000100000001通過上面的內存模型,結果一看即明白!第5個問題:關于數組的內存模型:#include<stdio.h>int main(void)char a4=0;a0=1;a1=1;a2=1;a3=1;printf(" a0:%d n a1:%d n a2:%d n a3:%d n ",&a0,&a1,&a2,&a3);return 0;運行的結果:解釋幾個問題:1, 我們在這里定義了一個ch

13、ar型數組,其實就相當于連續定義了四個變量發現內存結果和上面的變量很相似,只是定義變量的循序問題我們看一下這時的內存狀態: a3 a2 a1 a05 5545352 (字節)00000001000000010000000100000001思考這樣的一個問題,下面的程序會輸出到少?#include<stdio.h>int main(void)char a4=0;a0=1;a1=1;a2=1;a3=1;printf(" a0:%d n a1:%d n a2:%d n a3:%d n ",&a0,&a1,&a2,&a3);printf(

14、"%dn",*(int *)&a0);return 0;運行的結果為:解釋一個問題:1,16843009的二進制的形式為1000000010000000100000001,是不是很吃驚?第六個問題:關于指針的內存模型:#include<stdio.h>int main(void)int a=0;int b=0;int * pa=NULL;int * pb=NULL;printf("&a=%dn&b=%dn",&a,&b);pa=&a;pb=&b;printf("pa=%dnpb=%dn",pa,pb);return 0;運行結果是:解釋一些問題:1, 我們在這里定義了多少個變量?準確答案是4個,其中有兩個int變量,有兩個指向int的指針變量2, 為什么沒有強制轉換,因為pa的類型和&a的類型一致3, 在這里提出一個觀點:指針就是裝內存編號的變量。總結一下:1, 內存模型我們可以把計算機的內存看成是一個帶有很多格子的一個很長的容器(就像下面一樣)他們有編號的,并且編號是連續的。2, 每一個內存單元都有唯一的與之對應的內存編號3, 我們可以通過內存編號來訪

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論