前一段時間在一個好友的的博客論壇上看到他學習C++時碰到的一小點問題,是關于C++中最基本的內存分配方面的。其實對于內存這東西,除了知道我自己用的是256M的內存以外,我也不太清楚他到底里面是怎么工作的。看了大師們的講解,我深有體會,把這些講解整理出來,為所有C++的newbie們共勉! 正文: 事情是因為這樣一小段程序而來的。int main() { int i=10; int *j=&i; if(!0) { int l=20; int *k=&l; j=k; k=0; } cout<<*j; return 0; } 不用編譯器,大家想想執行過之后應該打印什么結果?我想大家的第一反應應該是打印出一個不確定的數。理由是在if語句里,我們定義了k這個變量,在if執行結束之后,這個變量k所占據的內存是被系統收回的,于是也就造成了變量j所指的結果非常不確定。當然,假如編譯并且執行過后,我們發現事情并不是像我們想象的那樣,程序最終的打印結果是20,并不是我們期待的一個不確定的數。下面就讓我們分析一下原因吧! 我們用debug的方式來一步一步的分析,在watch的窗口下輸入里面所有的變量。int i=10; //i is 10 and &i is 0x0012ff7c int *j=&i; //*j is 10 and &j is 0x0012ff7c //顯然可以看出此時兩個變量指的是同一地址 if(!0) { int l=20; //l is 20 and &l is 0x0012ff74 /*地址0x0012ff7c—0x0012ff75被占據。要說明的是, 這個數值很有可能因為電腦硬件的不同而不同。*/ int *k=&l; //*k is 20 and &k is 0x0012ff74 //變量k與l指向同一地址。 j=k; //j is 0x0012ff74 and *j is 20 /*指針間的賦值,這個語句的意思是把k指向的地址負值給j。 此時這兩個變量指向的是同一個地址,都是0x0012ff74,而那 塊地址存放的是20,所以也就有*j是20的原因。*/ }cout<<*j; //*j is 20 and j is 0x0012ff74 /*此時同時可以看到k的地址是0x00000000,說明k這個變量 已經被自動銷毀,所以地址指零。但是j所指的并不是k,而 是k所指的那段地址0x0012ff74,而由于此時j的生存周期還 沒有結束(j是在if意外定義的),所以j指向的這塊地址并 沒有被收回,也就保存下來20這個數了。*/ 至此,我們分析完了程序的全過程的內存分配情況,最終結果是這樣的。(圖1)