C_and_CPP 板


LINE

開發平台(Platform): (Ex: Win10, Linux, ...) Win7 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) Dev_CPP 問題(Question): 假如先宣告一陣列為: char a[10]; // a[0]~a[9] 使用 for(int i=0; a[i] ; i++) 如上在 i = 10 時 , a[i] 會存取到 a[10] 之非法記憶體 而 break 掉 但不會發生 runtime error. 但在 使用 if(a[10]) 作為判斷時 一樣存取到 a[10] 之非法記憶體 此時即會造成 runtime error. 想請問這兩者之間的差別 還有第一個for的用法是否有其風險在 謝謝大家 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 120.108.205.21
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1488346376.A.2D8.html
1F:→ Hazukashiine: 我不知道他們之間的差別,但是我只知道他們的共同點 03/01 13:41
2F:→ loveflames: 我可以說這個問題很沒營養嗎,都知道是非法位址了 03/01 13:42
3F:→ Hazukashiine: 就是你完全不需要知道一個非法的行為討論的必要性 03/01 13:42
4F:→ loveflames: 還問有沒有風險 03/01 13:42
5F:→ loveflames: 第一個沒當是運氣,剛好有分配這個位址的空間 03/01 13:43
6F:推 kyfish: 使用非法記憶體沒當場出錯絕對是運氣不好 真的別這樣用 03/01 13:45
7F:→ loveflames: 除非你是要用debugger直接分析記憶體,研究存取非法 03/01 13:49
8F:→ loveflames: 位址導致的結果,否則不要幹這種事 03/01 13:49
9F:推 james732: 你闖進不是你的房間,裡面有沒有人砍死你不知道XD 03/01 14:11
10F:推 stupid0319: 我想a[10]應該是可以讀取的,且不會error 03/01 16:02
11F:→ stupid0319: 寫入的話,應該要看寫到什麼地方,有機會造成錯誤 03/01 16:03
12F:推 steve1012: Undefined behavior 無法確定會發生啥事 就不要這樣搞 03/01 16:03
13F:→ steve1012: 依賴這種行為沒啥意義 03/01 16:03
14F:→ stupid0319: 而原PO的runtime error應該是stack爆掉了 03/01 16:03
15F:→ stupid0319: 跟a[10]存取無關,跟a[10]內容有關 03/01 16:04
16F:推 stupid0319: a[10] == 0, 無限loop, stack爆掉 03/01 16:08
17F:→ stupid0319: 又for(;a[i];);又取存到a[11]以上,一定會碰到false 03/01 16:12
18F:→ stupid0319: 想研究深入的話,多逆向一些遊戲或軟體就會了 03/01 16:13
19F:推 LPH66: >stupid0319 a[10] 不能用, a+10 倒是可以拿來比對 03/02 00:24
20F:→ LPH66: 然後 &a[10] == &(*(a+10)) == a+10 所以也沒問題 03/02 00:24
21F:→ LPH66: 這個是所謂 pointer to one-past-end, 可比對不可存取 03/02 00:25
22F:→ stupid0319: 第一次碰到 pointer to one-past-end, 沒想過的東西 03/02 00:59
23F:→ stupid0319: 照理說a[10]一定會有資料,到底程式會怎跑呢XD 03/02 01:03
24F:→ stupid0319: 是a[10]之後回傳的都是陣列最後一個值的意思嗎? 03/02 01:10
25F:→ loveflames: a[10]等於*(a+10) 03/02 08:22
26F:推 LPH66: 對 a[10] 存取是未定義行為, 但比對指標是否為 a+10 合法 03/02 10:04
27F:→ LPH66: 也就是這是 OK 的: for(char *p = a; p != a+10; p++) {} 03/02 10:05
28F:→ LPH66: 在這樣的迴圈裡面的 p 只會指向 a[0]~a[9] 03/02 10:06
29F:→ LPH66: 所以對其存取通通沒事 03/02 10:06
30F:→ LPH66: 然後因為上面那行等式, a+10 可以改寫成 &a[10] 也是對的 03/02 10:07
31F:→ LPH66: 也就是 a[10] 這樣的型式只在前面有取址時是合法的 03/02 10:08
32F:→ LPH66: 沒有取址的話它不是存就是取都是非法的 03/02 10:08
33F:→ stupid0319: 寫遊戲外掛不就是一堆非法行為集合嗎?? 03/02 10:31
34F:→ loveflames: 無聊,你拿鑽程式漏洞來跟寫程式比.... 03/02 10:35
35F:→ loveflames: 要不要乾脆說拿還沒清空的stack frame來用 03/02 10:36
36F:→ MOONRAKER: 看什麼外掛啊 練功程式不需要寫到非法行為 -_- 03/02 10:39
37F:推 firejox: 練習開shell阿(′・ω・`) 03/02 11:00
38F:→ firejox: 還有就是寫GC會有機會這樣做 03/02 11:12







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Boy-Girl站內搜尋

TOP