10

As far as I know, C defines NULL like this:

#define NULL ( (void *) 0)

Then, how should we define NULL_POINTER ? I defined it the same in my program and it worked, but I suppose that is just a coincidence:

#define NULL_POINTER ( (void *) 0)

What would be the logical definition, if any ?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Niklas Rosencrantz
  • 25,640
  • 75
  • 229
  • 424

2 Answers2

17
#define NULL ( (void *) 0)

and

#define NULL 0

are both valid. If you need to implement your own macro for null pointer, the same rule applies.

C11(ISO/IEC 9899:201x) §6.3.2.3 Pointers Section 3

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant

Community
  • 1
  • 1
Yu Hao
  • 119,891
  • 44
  • 235
  • 294
  • @PaulR According to http://port70.net/~nsz/c/c99/n1256.html#6.3.2.3, it's the same in C99. Although I do agree that the first definition is better. – Yu Hao Sep 13 '13 at 08:28
  • 5
    The first definition seems better to me since in some compilers comparing a numeric value to NULL results in a warning (e.g. _"[Warning] comparison between pointer and integer"_) while the second definition doesn't. Thus, the first definition provides better semantics. – Piovezan Dec 11 '14 at 17:14
5

It is only in pointer contexts that NULL and 0 are equivalent. 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. (Furthermore, ANSI allows the definition of NULL to be ((void *)0), which will not work at all in non-pointer contexts.) In particular, do not use NULL when the ASCII null character (NUL) is desired. Provide your own definition

#define NUL '\0'

NULL should be used only as a pointer constant.

Paul R
  • 208,748
  • 37
  • 389
  • 560
Dayal rai
  • 6,548
  • 22
  • 29