作者godman362 (Shizuru)
看板C_and_CPP
标题[语法] *(int *)0 = 0;
时间Mon Apr 13 15:56:02 2009
如同标题:*(int *)
0(数字0) =
0(数字0)
这个语法是我在看驱动程式中一个范例看到的
写出这行程式,他的意思是说提取一个NULL指标所造成的错误
但是我比较有疑问的是lvalue那段
*(int *)0这句是什麽意思
一般取成变数的话,如:*(int *)var;
这样是将var这个位址的值取出不是吗?
但是写成0表示什麽意义?不是variable又要如何assign值给它?
请各位先进指点一下,谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 203.74.245.163
1F:推 QQ29:这不是会造成错误嘛? 把0x0000的位置取值填上0这不是不合法嘛 04/13 16:04
2F:推 ledia:看成 *( (int *)ptr ) = 0; 会不会比较容易懂 ? 04/13 16:08
3F:→ godman362:按照ledia大的意思,不就是将ptr给0? 04/13 16:10
4F:→ godman362:也就是NULL值 04/13 16:10
5F:→ godman362:但是想请问,为什麽不给变数,给0会过呢? 04/13 16:11
6F:推 QQ29:不是耶 他是让一个指标指到 0这个位置 再对他取值 04/13 16:11
7F:→ godman362:Q大,这个我在上面提到了「提取一个NULL指标造成的错」 04/13 16:12
8F:→ godman362:对,我看错了,是这样没错 04/13 16:13
9F:推 QQ29:我比较好奇这是一个错误 有什麽特别涵义嘛 或是应用 04/13 16:13
10F:→ QQ29:没这方面的接触 @@ 04/13 16:13
11F:→ godman362:它只是一个用来表示提取NULL指标所造成的错误而已 04/13 16:14
12F:→ godman362:没有特别的意含,只是我对那个变数写0觉得怪怪的 04/13 16:14
13F:推 final01:我忘了为啥这样写,但这样写里有用处 04/13 16:28
14F:推 QQ29:如果有用处 但这样不是会触发错误嘛 还是有别的方式避免错误 04/13 16:28
15F:推 VictorTom:只是刻意设计一个对NULL位置做存取的动作说明错误吧?? 04/13 16:47
16F:推 ledia:其实也可以有 *(int *)0x12345678 = 0; 没有一定要变数 04/13 16:49
17F:推 QQ29:怎麽知道 哪些位置是合法 可以改动的呢??? 04/13 16:52
18F:推 ledia:一般来说, 我也不知道, 我想 driver 应该有其 mapping 吧 04/13 16:55
19F:→ final01:恩~看来我想错了 04/13 17:13
20F:→ godman362:嗯...那暂时只能这样认为了,谢谢ledia大 04/13 17:31
21F:推 VictorTom:怎麽知道哪些合法?? 基本上除了你自己定义或malloc或 04/13 18:00
22F:→ VictorTom:new出来等的变数所占用的位置区段外, 都是不合法的.... 04/13 18:00
23F:→ VictorTom:也许那些address你可以读写不发生error, 但是没有人晓得 04/13 18:01
24F:→ VictorTom:随意读/写一个未知的address会发生什麽问题....@_@" 04/13 18:01
25F:推 softwind:mem map io会这样写 但是 通常 对 0 dereference应该会爆 04/13 21:23
26F:→ tinlans:就是把 sizeof(int) 这麽大的区间都填 0 的意思。 04/13 23:52
27F:推 wowtiger:不就 mapping 而已 要知道 segment or selector 才算吧 04/14 00:14
28F:→ godman362:楼上W大的意思不太明了,可否细说? 04/14 09:12