看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 標題: [問題] local變數 行為 : 時間: Wed Dec 16 00:22:11 2009 : 小弟我回應一下我理解的原po想測試的東西與問題.... 因為再推文下去好像有點麻煩難解釋XD : 今天突然想到一個小問題 : class A : { : public: : void XD(){int x;<==故意不給初值 cout<<x; x++;} : }; : : A a1,a2; : a1.XD(); a2.XD(); : : 我認為我預期答案也許會差1 : 不過手邊沒vc 請同學用vc6 測試 印出兩次-xxxxx 一樣的兩個任意數值 : 我印象vc8好像去存取沒初始質的變數會發出exeption 應該是發warning, 而且是compile time就會告訴你.... exception這種應該是run time才會遇到的.... : 這我忽略~ 我是好奇 a1.XD()到a2.XD()這之間 : x到底是動了甚麼手腳 為啥會在初始化一次 : 我觀念是local變數跳出這scope 就類似delete一樣標記這位址的值可以被蓋掉 : 但是現在看來 x好像都會初始成某一個奇怪的特定數值 : 請問該怎麼解釋呢??? 一般function call內的local var只是在function進入時.... 把傳入參數與內部使用的local var通通由stack來存放.... 所以實際上不會像delete一樣用標記的方式.... 因為stack的push/pop與內容值就一直隨run time在改變.... 至於未初始化的變數小弟在原文推文裡有解釋過了.... VC debug build會把local var都初始化成0xcccccccc(視byte count不同) 動態配置來的空間則初始畫成0xcdcdcdcd.... 這點可以下break point與watch來看看就知道了.... : : : thx~~ : : -- : ※ 發信站: 批踢踢實業坊(ptt.cc) : ◆ From: 123.192.136.174 : 推 VictorTom:VC的debug mode會把區域變數初始化為0xcccccccc, 動態要 12/16 00:29 : → VictorTom:來的初始化成0xcdcdcdcd; 你可以下break用watch看:) 12/16 00:30 : → dp2:支持VT。。我好想不能推文了 12/16 00:34 : 推 oddguy:這個程序……請仔細看,對于a1是分配了一個未初始化的local 12/16 00:41 : 推 VictorTom:樓上要cd一下才能再推文XD 該技能要冷卻時間才能再用XDD 12/16 00:41 : → oddguy:變數x,對于a2則是另外又再分配了一個未初始化的變數x啊 12/16 00:42 : → nowar100:兩個是不同的物件阿 XD 12/16 00:43 : → oddguy:兩者絕不是同一個x!所以當然不會是差1了 12/16 00:43 : → VictorTom:存取未初始化的變數應該是發warning, 不是exception@_@" 12/16 00:43 : → QQ29:兩個是同一個x吧~ 我印他們位址是一樣的阿 12/16 00:43 : → oddguy:實際上a1.XD()執行完畢后,local變數x已經不存在了。 12/16 00:44 其實導入object小弟不太確定, 但是如果是普通function call的話.... 像原po舉例的單純function連call兩次, 是很容易同一變數配在同一位址.... 因為同樣的function它push進stack各變數佔用的layout理論上是一樣的.... local x與其說不存在, 不如說那塊記憶體現在不歸它使用了.... 個人猜原po是不是想模擬function基於stack特性使用了同一位址.... 於是用很tricky的方式(也不是很有效)來測試記憶體中的暫留值.... 測試結果之所以失敗, 就是小弟說的VC的機制.... 改release built會不會成功, 小弟我也不知道XD 以上, 就個人解讀與猜測騙一下文章數.... 有漏誤的還請各位大大不吝指正....<(_ _)> -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.132.174.98
dp2:可以看下匯編碼,但是手頭沒有vc6,不知vc8/9行為是否一致 12/16 00:55
oddguy:解釋的非常清楚!拍手 12/16 00:57
oddguy:function stack的問題,印象中是語言特性,與vc編譯器無關 12/16 00:58
dp2:順便推一把…… 12/16 00:58
oddguy:對了小弟新來ptt,不知“cd一下再推文”的“cd”是何意? 12/16 01:03
nowar100:cool down 12/16 01:04
dp2:看了2008的匯編代碼,確實是先寫入0xcccccccccccccccccccccccc 12/16 01:07
jaw109:cccccccc,cdcdcdcd,feeefeee這都是有意義的 12/16 01:10
jaw109:詳見wiki "magic number" 12/16 01:10
VictorTom:對不起我不該耍冷講cd, 前陣子才學會這詞想說秀一下Orz 12/16 01:13
VictorTom:說到magic number, 我們家driver最愛用deadbeef....XD 12/16 01:17
nowar100:長知識了@@" 原來這是magic number 12/16 01:23