还真有不是0的NULL,C语言的各种实现太乱了
5.17: Seriously, have any actual machines really used nonzero null
pointers, or different representations for pointers to different
types?
A: The Prime 50 series used segment 07777, offset 0 for the null
pointer, at least for PL/I. Later models used segment 0, offset
0 for null pointers in C, necessitating new instructions such as
TCNP (Test C Null Pointer), evidently as a sop to all the extant
poorly-written C code which made incorrect assumptions. Older,
word-addressed Prime machines were also notorious for requiring
larger byte pointers (char *’s) than word pointers (int *’s).
The Eclipse MV series from Data General has three
architecturally supported pointer formats (word, byte, and bit
pointers), two of which are used by C compilers: byte pointers
for char * and void *, and word pointers for everything else.
Some Honeywell-Bull mainframes use the bit pattern 06000 for
(internal) null pointers.
The CDC Cyber 180 Series has 48-bit pointers consisting of a
ring, segment, and offset. Most users (in ring 11) have null
pointers of 0xB00000000000. It was common on old CDC ones-
complement machines to use an all-one-bits word as a special
flag for all kinds of data, including invalid addresses.
The old HP 3000 series uses a different addressing scheme for
byte addresses than for word addresses; like several of the
machines above it therefore uses different representations for
char * and void * pointers than for other pointers.
The Symbolics Lisp Machine, a tagged architecture, does not even
have conventional numeric pointers; it uses the pair
(basically a nonexistent handle) as a C null
pointer.
Depending on the “memory model” in use, 8086-family processors
(PC compatibles) may use 16-bit data pointers and 32-bit
function pointers, or vice versa.
Some 64-bit Cray machines represent int * in the lower 48 bits
of a word; char * additionally uses the upper 16 bits to
indicate a byte address within a word.
References: K&R1 Sec. A14.4 p. 211.
老大,你不如总结一下,搞一片论文出来,我也懒得去看这些蝌蚪文字了。搞清楚了以后,也让我可以去蒙几个人,打击打击一些人的嚣张气焰,哈哈
说实话,我也很晕。NULL被define为( void * ) 0是
“ANSI allows”的,但也不是强制定义。
5.9里面说有的时候不应该用NULL
NULL should *not* be used when another kind of 0 is required,
even though it might work, because doing so sends the wrong
stylistic message.
我原来以为应该一直用NULL的。
看 5.17 里面有好多机种的NULL都不是0,虽说几乎没有
需要给这些古怪的机器写程序。毕竟危险啊!
再看 5.2,只能说C的指针太乱了