9

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,438
  • 68
  • 55
  • 126
Niklas Rosencrantz
  • 23,939
  • 70
  • 214
  • 404

2 Answers2

16
#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
  • 115,525
  • 42
  • 225
  • 281
  • @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
4

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
  • 202,568
  • 34
  • 375
  • 539
Dayal rai
  • 6,308
  • 21
  • 29