看板 C_and_CPP 關於我們 聯絡資訊
今天突然想到一個小問題 class A { public: void XD(){int x;<==故意不給初值 cout<<x; x++;} }; A a1,a2; a1.XD(); a2.XD(); 我認為我預期答案也許會差1 不過手邊沒vc 請同學用vc6 測試 印出兩次-xxxxx 一樣的兩個任意數值 我印象vc8好像去存取沒初始質的變數會發出exeption 這我忽略~ 我是好奇 a1.XD()到a2.XD()這之間 x到底是動了甚麼手腳 為啥會在初始化一次 我觀念是local變數跳出這scope 就類似delete一樣標記這位址的值可以被蓋掉 但是現在看來 x好像都會初始成某一個奇怪的特定數值 請問該怎麼解釋呢??? 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
oddguy:你只要用&x打印出兩次變數x的地址來就明白了 12/16 00:45
QQ29:位址一樣阿....function只有一份不是嗎 12/16 00:46
oddguy:位址一樣是由于程序簡單而碰巧的。或者是編譯器優化的結果 12/16 00:48
QQ29:V大意思是 int x;他會初始成cc...c所以都會同一個值? 12/16 00:49
weiyucsie:請不要假設x的初始值... 12/16 00:50
QQ29:位址不會不一樣吧 函數的位址一樣,local 變數的 offset 也一 12/16 00:50
QQ29:一樣 不是嗎 12/16 00:51
Ag2S:位址沒有一定一樣阿 如果是說 function的text是一樣 12/16 00:53
Ag2S:但local variable是在stack裡 要看OS怎麼配置stack吧 12/16 00:53
dp2:就算位址一樣,編譯器也可以插入代碼來初始化這些變量…… 12/16 00:53
dp2:雖然我不是很確定這個老舊的編譯器是怎麼做的.. 12/16 00:54
dp2:referred to VC6 + debug 12/16 00:54
VictorTom:直接回應一篇好了, 騙騙文章數, 快破百了....XD 12/16 00:55
oddguy:假如在a1.XD()和a2.XD()之間還有別的內存操作 12/16 00:55
oddguy:x的位址大概就不一樣了 12/16 00:55
VictorTom:單純的內存操作應該還好, 要影響到ESP才會看到吧@_@" 12/16 00:58
VictorTom:不過這種測試的code, 千萬都別真的實際使用就是了XD 12/16 00:59
ledia:運氣好位址就會一樣, 但是寫程式不能靠絲毫的運氣 12/16 01:07
QQ29:可是如果位址不一樣 如果我有一百萬個A物件 那不就有一百萬個 12/16 01:17
QQ29:位址的可能性了嗎? function不是在compile時就配置好大小了? 12/16 01:18
nowar100:function配好的位置是code的部分,實際在跑是stack部分 12/16 01:19
nowar100:位址一樣只是巧合,你可以先call一個function f 12/16 01:20
nowar100:理面直接再call a2.XD(); 你就會發現位址不一樣了 12/16 01:20
VictorTom:推n板大的解釋:) 也推disasm trace進組語層來看:) 12/16 01:22
QQ29:可是我測試版大的程序 位址也還是一樣阿... 12/16 01:27
QQ29:stack 難道不能定死說一定只在那個位址作存取嗎? 12/16 01:27
QQ29:如果位址會不一樣 那為啥要討論 critical section呢@@ 12/16 01:28
VictorTom:stack不是你管的, 那是OS隨run time排給你的.... 12/16 01:28
VictorTom:所以沒有你要求一定要用stack哪裡這種事情:) 12/16 01:29
QQ29:OS排給我可是我同一個process stack就應該一樣不是嗎@@ 12/16 01:30
ledia:當然不是啦~~~ 12/16 01:47
ledia:中間可能有執行其它東西先疊進 stack 呀 12/16 01:49
ledia:簡單問一下, 如果 XD 裡面又呼叫 XD (傳說中的遞迴) 12/16 01:50
ledia:照你所說的樣子的話, 我要怎麼樣才能弄出獨立的變數呢 ? 12/16 01:50
ledia:是各層 function call 都要存不同值的變數喔 12/16 01:51