Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

Is a pointer pointing to 0x0000 the same as a pointer set to NULL? If NULL value is defined in the C language, then what location does it physically translate to? Is it the same as 0x0000. Where can I find more details about these concepts?

share|improve this question
    
This has already been asked on Stack Overflow - stackoverflow.com/questions/1296843/…. I think it's borderline for us, but I'm willing to give it the benefit of the doubt for the moment. –  ChrisF Jan 4 '12 at 16:08
add comment

4 Answers

up vote 5 down vote accepted

A point that most of the answers here are not addressing, at least not explicitly, is that a null pointer is a value that exists during execution, and a null pointer constant is a syntactic construct that exists in C source code.

A null pointer constant, as Karlson's answer correctly states, is either an integer constant expression with the value 0 (a simple 0 is the most common example), or such an expression cast to void* (such as (void*)0).

NULL is a macro, defined in <stddef.h> and several other standard headers, that expands to an implementation-defined null pointer constant. The expansion is typically either 0 or ((void*)0) (the outer parentheses are needed to satisfy other language rules).

So a literal 0, when used in a context that requires an expression of pointer type, always evaluates to a null pointer, i.e., a unique pointer value that points to no object. That does not imply anything about the representation of a null pointer. Null pointers are very commonly represented as all-bits-zero, but they can be represented as anything. But even if a null pointer is represented as 0xDEADBEEF, 0 or (void*)0 is still a null pointer constant.

This answer to the question on stackoverflow covers this well.

This implies, among other things, that memset() or calloc(), which can set a region of memory to all-bits-zero, will not necessarily set any pointers in that region to null pointers. They're likely to do so on most implementations, but the language doesn't guarantee it.

I don't know why this question isn't considered a duplicate of this one, or how it's topical here, but I don't have enough rep to vote to close it.

share|improve this answer
1  
One of my peeves with the design and evolution of C is that the digit zero has continued to be used as a non-deprecated representation of a null pointer. Back in the earliest days of the language (e.g. before the advent of things like function prototypes), pointers and integers were sufficiently interchangeable that using "0" for a null pointer was simple and it would "just work". Once it became necessary to distinguish between the integer quantity zero and a null pointer, however, the "0" representation should have been deprecated in favor of a keyword or operator sequence. –  supercat Jul 13 '12 at 16:29
    
Does this mean that the NULL pointer may actually point to some location when it is assigned NULL depending on the platform? The null pointer constant maybe a syntactic construct but what exactly happens when the code runs? Lets suppose this syntactic construct has been compiled on the GNU/Linux platform. What is the pointer value when we assign NULL to it? How does this address differ from any other address? –  Arpith Aug 6 '12 at 13:16
1  
@Arpith: Assigning NULL, or any null pointer constant, to a pointer object sets that object's value to a null pointer. On the machine level, it may well point to some valid chunk of memory. Dereferencing a null pointer has undefined behavior; accessing a chunk of memory at address 0x0000000 is valid behavior, as is literally anything else. That address differs from any other address by (a) comparing equal to NULL, and (b) comparing unequal to any pointer to a C object. A null pointer is an arbitrary pointer value used to indicate that it doesn't point to anything. –  Keith Thompson Aug 6 '12 at 19:01
add comment

Every platform out there is free to define NULL as it pleases.

According to the C Standard, if you assign zero to a pointer it will be converted to a NULL value (for that platform.) However, if you take a NULL pointer and cast it to int, there are no guarantees that you will get zero on every platform out there. The fact however is that on most platforms it will be zero.

Information about that stuff you can find in The C Language Specification. One source, the trustworthiness of which I cannot vouch for, is this: http://www.winapi.co.kr/pds/doc/ISO-C-FDIS.1999-04.pdf

share|improve this answer
2  
If they choose to break away from the standard they are free to redefine NULL pointer constant. As far as I know there are no compilers out there that do that. –  Karlson Jan 4 '12 at 15:07
    
Is there any compiler out there that doesn't implement NULL as 0? And is NULL guaranteed to evaluate to false? –  ugoren Jan 4 '12 at 22:27
    
NULL is guaranteed to evaluate to false by the standard. I do not know if there is any compiler (platform, actually) that does not implement NULL as 0, and I seriously doubt it, but the standard does not prohibit it, so who knows. –  Mike Nakis Jan 4 '12 at 22:52
    
There is confusion between representation of the abstract "null pointer constant" (as mentioned in the spec) in memory, which may be as the platform maker pleases and the definition of NULL macro, which has to expand to 0 in C++ and either 0 or (void *)0 in C, because that is the real "null pointer constant". –  Jan Hudec Jan 5 '12 at 10:13
    
While NULL can be in theory be defined as anything, there is however a guarantee by the standard that an int constant with the value 0 typecasted to a pointer will result in a null pointer (ISO 9899:1999 6.3.2.3/3). The NULL macro of stddef.h must be a null pointer (7.17/3), so it would be very burdensome for the compiler not to implement NULL as either 0 or (void*)0. –  user29079 Jan 9 '12 at 14:00
add comment

It is defined in the C language because there is no one unvarying machine address that it equates to. If it did, we wouldn't need an abstraction from it! Even though on most platforms, NULL might eventually be implemented as 0 of some type or other, it's simply wrong to assume that this is universally so, if you care about portability at all.

share|improve this answer
    
That's what standards are for open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf –  Karlson Jan 4 '12 at 15:08
add comment

According to C Standard Document section 6.3.2.3:

An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.55) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.

So far I have not seen a compiler that has broken away from this.

share|improve this answer
    
@PéterTörök You're right it's a tyop. :) –  Karlson Jan 4 '12 at 15:25
1  
Yes, but notice that it does not say anything about the pointer actually having numeric value of 0. It may not, though on most platforms it does. –  Jan Hudec Jan 5 '12 at 10:08
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.