什么时候的NULL宏不是0?

我几年前一直记得读这篇文章,但我在网上找不到任何参考。

你能给我一个例子,其中NULL宏未扩展为0?

编辑为了清楚:今天它扩展到((void *)0),(0)或(0L)。然而,有一些架构长期被遗忘,这不是真的,NULL扩展到不同的地址。就像是

#ifdef UNIVAC
     #define NULL (0xffff)
#endif

我在寻找这样的机器的例子。

更新以解决问题:

我不是在当前标准的上下文中的这个问题,或者打扰人们用我不正确的术语。然而,我的假设被接受的答案证实:

Later models used [blah], evidently as a sop to all the extant poorly-written C code which made incorrect assumptions.

有关当前标准中的空指针的讨论,请参见this question

C FAQ有一些具有非0 NULL表示的历史机器的例子。

The C FAQ Listquestion 5.17

Q: 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 [footnote] 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. For historical reasons during the
evolution of the 32-bit MV line from the 16-bit Nova line, word
pointers and byte pointers had the offset, indirection, and ring
protection bits in different places in the word. Passing a mismatched
pointer format to a function resulted in protection faults.
Eventually, the MV C compiler added many compatibility options to try
to deal with code that had pointer type mismatch errors.

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 some of the upper 16 bits to indicate a
byte address within a word.

http://stackoverflow.com/questions/2597142/when-was-the-null-macro-not-0

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:什么时候的NULL宏不是0?