[問題] local變數 行為

看板C_and_CPP作者 (我愛阿蓉)時間16年前 (2009/12/16 00:22), 編輯推噓10(10036)
留言46則, 8人參與, 最新討論串1/3 (看更多)
今天突然想到一個小問題 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

12/16 00:29, , 1F
VC的debug mode會把區域變數初始化為0xcccccccc, 動態要
12/16 00:29, 1F

12/16 00:30, , 2F
來的初始化成0xcdcdcdcd; 你可以下break用watch看:)
12/16 00:30, 2F

12/16 00:34, , 3F
支持VT。。我好想不能推文了
12/16 00:34, 3F

12/16 00:41, , 4F
這個程序……請仔細看,對于a1是分配了一個未初始化的local
12/16 00:41, 4F

12/16 00:41, , 5F
樓上要cd一下才能再推文XD 該技能要冷卻時間才能再用XDD
12/16 00:41, 5F

12/16 00:42, , 6F
變數x,對于a2則是另外又再分配了一個未初始化的變數x啊
12/16 00:42, 6F

12/16 00:43, , 7F
兩個是不同的物件阿 XD
12/16 00:43, 7F

12/16 00:43, , 8F
兩者絕不是同一個x!所以當然不會是差1了
12/16 00:43, 8F

12/16 00:43, , 9F
存取未初始化的變數應該是發warning, 不是exception@_@"
12/16 00:43, 9F

12/16 00:43, , 10F
兩個是同一個x吧~ 我印他們位址是一樣的阿
12/16 00:43, 10F

12/16 00:44, , 11F
實際上a1.XD()執行完畢后,local變數x已經不存在了。
12/16 00:44, 11F

12/16 00:45, , 12F
你只要用&x打印出兩次變數x的地址來就明白了
12/16 00:45, 12F

12/16 00:46, , 13F
位址一樣阿....function只有一份不是嗎
12/16 00:46, 13F

12/16 00:48, , 14F
位址一樣是由于程序簡單而碰巧的。或者是編譯器優化的結果
12/16 00:48, 14F

12/16 00:49, , 15F
V大意思是 int x;他會初始成cc...c所以都會同一個值?
12/16 00:49, 15F

12/16 00:50, , 16F
請不要假設x的初始值...
12/16 00:50, 16F

12/16 00:50, , 17F
位址不會不一樣吧 函數的位址一樣,local 變數的 offset 也一
12/16 00:50, 17F

12/16 00:51, , 18F
一樣 不是嗎
12/16 00:51, 18F

12/16 00:53, , 19F
位址沒有一定一樣阿 如果是說 function的text是一樣
12/16 00:53, 19F

12/16 00:53, , 20F
但local variable是在stack裡 要看OS怎麼配置stack吧
12/16 00:53, 20F

12/16 00:53, , 21F
就算位址一樣,編譯器也可以插入代碼來初始化這些變量……
12/16 00:53, 21F

12/16 00:54, , 22F
雖然我不是很確定這個老舊的編譯器是怎麼做的..
12/16 00:54, 22F

12/16 00:54, , 23F
referred to VC6 + debug
12/16 00:54, 23F

12/16 00:55, , 24F
直接回應一篇好了, 騙騙文章數, 快破百了....XD
12/16 00:55, 24F

12/16 00:55, , 25F
假如在a1.XD()和a2.XD()之間還有別的內存操作
12/16 00:55, 25F

12/16 00:55, , 26F
x的位址大概就不一樣了
12/16 00:55, 26F

12/16 00:58, , 27F
單純的內存操作應該還好, 要影響到ESP才會看到吧@_@"
12/16 00:58, 27F

12/16 00:59, , 28F
不過這種測試的code, 千萬都別真的實際使用就是了XD
12/16 00:59, 28F

12/16 01:07, , 29F
運氣好位址就會一樣, 但是寫程式不能靠絲毫的運氣
12/16 01:07, 29F

12/16 01:17, , 30F
可是如果位址不一樣 如果我有一百萬個A物件 那不就有一百萬個
12/16 01:17, 30F

12/16 01:18, , 31F
位址的可能性了嗎? function不是在compile時就配置好大小了?
12/16 01:18, 31F

12/16 01:19, , 32F
function配好的位置是code的部分,實際在跑是stack部分
12/16 01:19, 32F

12/16 01:20, , 33F
位址一樣只是巧合,你可以先call一個function f
12/16 01:20, 33F

12/16 01:20, , 34F
理面直接再call a2.XD(); 你就會發現位址不一樣了
12/16 01:20, 34F

12/16 01:22, , 35F
推n板大的解釋:) 也推disasm trace進組語層來看:)
12/16 01:22, 35F

12/16 01:27, , 36F
可是我測試版大的程序 位址也還是一樣阿...
12/16 01:27, 36F

12/16 01:27, , 37F
stack 難道不能定死說一定只在那個位址作存取嗎?
12/16 01:27, 37F

12/16 01:28, , 38F
如果位址會不一樣 那為啥要討論 critical section呢@@
12/16 01:28, 38F

12/16 01:28, , 39F
stack不是你管的, 那是OS隨run time排給你的....
12/16 01:28, 39F

12/16 01:29, , 40F
所以沒有你要求一定要用stack哪裡這種事情:)
12/16 01:29, 40F

12/16 01:30, , 41F
OS排給我可是我同一個process stack就應該一樣不是嗎@@
12/16 01:30, 41F

12/16 01:47, , 42F
當然不是啦~~~
12/16 01:47, 42F

12/16 01:49, , 43F
中間可能有執行其它東西先疊進 stack 呀
12/16 01:49, 43F

12/16 01:50, , 44F
簡單問一下, 如果 XD 裡面又呼叫 XD (傳說中的遞迴)
12/16 01:50, 44F

12/16 01:50, , 45F
照你所說的樣子的話, 我要怎麼樣才能弄出獨立的變數呢 ?
12/16 01:50, 45F

12/16 01:51, , 46F
是各層 function call 都要存不同值的變數喔
12/16 01:51, 46F
文章代碼(AID): #1B9xUsSm (C_and_CPP)
文章代碼(AID): #1B9xUsSm (C_and_CPP)