[問題] C的考題

看板C_and_CPP作者 (囧雷諾)時間13年前 (2011/03/03 22:58), 編輯推噓22(22036)
留言58則, 20人參與, 最新討論串3/3 (看更多)
最近準備研究所遇到一個問題 是關於C語言的,不知能不能在這裡問,違反板規我會刪除謝謝! ====================================================================== 以下程式碼: int a[2]; int b; int i; b=5; for(i=0;i<=2;i++) a[i]=i; printf("b is %d\n",b); 題目說會發生一種情況,b會從5變到2 且解釋如何發生 可是我怎麼看都不可能發生說@@" -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.161.194.32

03/03 23:01, , 1F
buffer overflow a[2]存取超過界了 這很明顯吧 = =
03/03 23:01, 1F

03/03 23:02, , 2F
for(i=0;i<=2;i++) <=想想這會跑幾次?陣列a有多大?
03/03 23:02, 2F

03/03 23:09, , 3F
但是for跑完後i是3吧...
03/03 23:09, 3F

03/03 23:11, , 4F
請問這為什麼會造成b改變@@?
03/03 23:11, 4F

03/03 23:12, , 5F
可是跟B沒關係吧
03/03 23:12, 5F

03/03 23:13, , 6F
記憶體是用stack 的方式在存的 array overbound它不管
03/03 23:13, 6F

03/03 23:13, , 7F
照樣 存 於是就存到原本應該是放i的四bytes去 i就被改掉
03/03 23:13, 7F

03/03 23:13, , 8F
更正 原本放b = =
03/03 23:13, 8F

03/03 23:15, , 9F
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
03/03 23:15, 9F

03/03 23:16, , 10F
但程式跑出來還是5,是因為compiler有什麼機制嗎?
03/03 23:16, 10F

03/03 23:18, , 11F
翻譯樓上a[2]=2存取到b了 原因google我推的前兩個字 很多
03/03 23:18, 11F

03/03 23:18, , 12F
說明還有附圖
03/03 23:18, 12F

03/03 23:19, , 13F
http://nopaste.csie.org/ce1ae <-跟這程式類似意思
03/03 23:19, 13F

03/03 23:19, , 14F
我猜是OS吧我在linux上跑是2 windows是5
03/03 23:19, 14F

03/03 23:20, , 15F
我用vc++也發生了runtime error...XD
03/03 23:20, 15F

03/03 23:21, , 16F
james給的連結怎麼用@@?
03/03 23:21, 16F

03/03 23:23, , 17F
研究所考這個太沒道理啦
03/03 23:23, 17F

03/03 23:24, , 18F
我用dev-c++是5,而且我宣告a[0],他竟然跑的出a[1]的值
03/03 23:24, 18F

03/03 23:24, , 19F
我os 是XP...跑出來是5..............
03/03 23:24, 19F

03/03 23:25, , 20F
我也是用dev 我宣告int a[2]; a[4]放東西 還是沒錯耶...
03/03 23:25, 20F

03/03 23:29, , 21F
其實有一樓的觀念就好,這題實在沒啥營養...XDD
03/03 23:29, 21F

03/03 23:36, , 22F
實在非常感謝大家回答!
03/03 23:36, 22F

03/03 23:36, , 23F
真的很沒營養, 為什麼要研究錯誤的程式.
03/03 23:36, 23F

03/03 23:42, , 24F
沒辦法考研究所不營養也得吃 總不能答案寫這題很沒營養= =
03/03 23:42, 24F

03/03 23:47, , 25F
如果這問題問的是b會變成多少 那的確很沒營養
03/03 23:47, 25F

03/03 23:48, , 26F
但如果它問的是「為什麼在某些情況下b會變成2」
03/03 23:48, 26F

03/03 23:48, , 27F
就不見得是沒營養題了,修過組合語言的人一定答得出來
03/03 23:48, 27F

03/03 23:51, , 28F
我覺得不必考,因為感覺不出實用性
03/03 23:51, 28F

03/04 00:01, , 29F
我覺得不修組合語言也要會吧 考你的程式認識度
03/04 00:01, 29F

03/04 00:01, , 30F
然後我上面回的那個...我以為for後面就有分號了
03/04 00:01, 30F

03/04 00:01, , 31F
中興計算機概論今年就出for後面有分號的 XD
03/04 00:01, 31F

03/04 00:16, , 32F
原來研究所都考這個,那閉著眼晴也可以上吧.....
03/04 00:16, 32F

03/04 02:29, , 33F
中興還考括號加分號(A,B)會回傳哪個值呢~
03/04 02:29, 33F

03/04 02:29, , 34F
逗號
03/04 02:29, 34F

03/04 02:48, , 35F
你真的要去考試嗎...?
03/04 02:48, 35F

03/04 03:03, , 36F
當大家都閉著眼睛都會上時,你閉著眼睛就不一定會上了XD
03/04 03:03, 36F

03/04 06:03, , 37F
跑出5最有可能是b被optimized掉了
03/04 06:03, 37F

03/04 06:04, , 38F
b is not changed so some compilers will remove it
03/04 06:04, 38F

03/04 10:18, , 39F
中興考逗號那題真的很扯...
03/04 10:18, 39F

03/04 11:16, , 40F
這是想考啥~真的只是想考BO嗎
03/04 11:16, 40F

03/04 13:43, , 41F
這應該是有可能變成2 而不是一定吧 看compiler吧
03/04 13:43, 41F

03/04 14:14, , 42F
題目:「b會從5變到2 且解釋如何發生」
03/04 14:14, 42F

03/04 14:16, , 43F
答:他(她)不是用微軟的產品,所以b才會從5變到2 <-100分?!
03/04 14:16, 43F

03/04 14:18, , 44F
14:16這樣回答,這篇這題研究所題目會不會(考)得滿分?
03/04 14:18, 44F

03/04 15:27, , 45F
http://codepad.org/SGALfGbg 下次出題可以考這個
03/04 15:27, 45F

03/04 15:28, , 46F
解釋 str 內容有可能改變的原因
03/04 15:28, 46F

03/04 18:17, , 47F
我以為某樓只有在特定版才會出現...看到推文就頭痛
03/04 18:17, 47F

03/04 18:58, , 48F
如果14:16那樣回答,我可能會給14:16(自己)零分(我離題了
03/04 18:58, 48F

03/04 22:18, , 49F
Ji**XD:我猜是OS吧我在linux上跑是2 windows是5 23:19
03/04 22:18, 49F

03/04 22:20, , 50F
我: 我在linux上跑是5 windows是5
03/04 22:20, 50F

03/04 22:22, , 51F
到底是我對? 還是台灣大學對? 這這...
03/04 22:22, 51F

03/04 22:25, , 52F
1 開頭的ip怎麼弄得XD
03/04 22:25, 52F

03/04 22:30, , 53F
1-161-194-32.dynamic.hinet.net 申請中華電信
03/04 22:30, 53F

03/04 23:27, , 54F
這跟Compiler有關吧 如果a[2]是b的位置 那程式就有這個
03/04 23:27, 54F

03/04 23:27, , 55F
記憶體位置的使用權 OS應該不會阻擋 所以看編譯器有沒
03/04 23:27, 55F

03/04 23:28, , 56F
做檢查 (怎樣編成機械語言)
03/04 23:28, 56F

03/04 23:34, , 57F
我家最近申請的Hinet光世代也是1開頭的
03/04 23:34, 57F

03/05 09:14, , 58F
class A ?
03/05 09:14, 58F
文章代碼(AID): #1DRwoXgr (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DRwoXgr (C_and_CPP)