看板 C_and_CPP 關於我們 聯絡資訊
如同標題:*(int *)0(數字0) = 0(數字0) 這個語法是我在看驅動程式中一個範例看到的 寫出這行程式,他的意思是說提取一個NULL指標所造成的錯誤 但是我比較有疑問的是lvalue那段 *(int *)0這句是什麼意思 一般取成變數的話,如:*(int *)var; 這樣是將var這個位址的值取出不是嗎? 但是寫成0表示什麼意義?不是variable又要如何assign值給它? 請各位先進指點一下,謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.74.245.163
QQ29:這不是會造成錯誤嘛? 把0x0000的位置取值填上0這不是不合法嘛 04/13 16:04
ledia:看成 *( (int *)ptr ) = 0; 會不會比較容易懂 ? 04/13 16:08
godman362:按照ledia大的意思,不就是將ptr給0? 04/13 16:10
godman362:也就是NULL值 04/13 16:10
godman362:但是想請問,為什麼不給變數,給0會過呢? 04/13 16:11
QQ29:不是耶 他是讓一個指標指到 0這個位置 再對他取值 04/13 16:11
godman362:Q大,這個我在上面提到了「提取一個NULL指標造成的錯」 04/13 16:12
godman362:對,我看錯了,是這樣沒錯 04/13 16:13
QQ29:我比較好奇這是一個錯誤 有什麼特別涵義嘛 或是應用 04/13 16:13
QQ29:沒這方面的接觸 @@ 04/13 16:13
godman362:它只是一個用來表示提取NULL指標所造成的錯誤而已 04/13 16:14
godman362:沒有特別的意含,只是我對那個變數寫0覺得怪怪的 04/13 16:14
final01:我忘了為啥這樣寫,但這樣寫裡有用處 04/13 16:28
QQ29:如果有用處 但這樣不是會觸發錯誤嘛 還是有別的方式避免錯誤 04/13 16:28
VictorTom:只是刻意設計一個對NULL位置做存取的動作說明錯誤吧?? 04/13 16:47
ledia:其實也可以有 *(int *)0x12345678 = 0; 沒有一定要變數 04/13 16:49
QQ29:怎麼知道 哪些位置是合法 可以改動的呢??? 04/13 16:52
ledia:一般來說, 我也不知道, 我想 driver 應該有其 mapping 吧 04/13 16:55
final01:恩~看來我想錯了 04/13 17:13
godman362:嗯...那暫時只能這樣認為了,謝謝ledia大 04/13 17:31
VictorTom:怎麼知道哪些合法?? 基本上除了你自己定義或malloc或 04/13 18:00
VictorTom:new出來等的變數所佔用的位置區段外, 都是不合法的.... 04/13 18:00
VictorTom:也許那些address你可以讀寫不發生error, 但是沒有人曉得 04/13 18:01
VictorTom:隨意讀/寫一個未知的address會發生什麼問題....@_@" 04/13 18:01
softwind:mem map io會這樣寫 但是 通常 對 0 dereference應該會爆 04/13 21:23
tinlans:就是把 sizeof(int) 這麼大的區間都填 0 的意思。 04/13 23:52
wowtiger:不就 mapping 而已 要知道 segment or selector 才算吧 04/14 00:14
godman362:樓上W大的意思不太明瞭,可否細說? 04/14 09:12