Question

I am working on a project and I keep coming across this error that will not allow me to complete the project. When I initialize one of my pointers to point to an object that will be made during the execution of the program and I initialize it to NULL. Then when I check to see what it is set to it returns a value of nil. How is such a thing possible? I didn't believe that nil pointers existed in C. Is there any way around this?

struct order_line *front = NULL;
...
printf("Head: %p\n", front);  // prints -> Head: (nil)
Was it helpful?

Solution

%p in printf formats a pointer type. This is going to distinguish a null-pointer and print (nil) because it is a special value in the context of a pointer. If you want to output 0 for a null pointer, cast the pointer to an integer and use %d instead:

printf("Head: %d\n", (int) front);

Original answer as it may still be useful:

NULL is a macro defined as 0 or ((void *) 0), so if you set a pointer to NULL it's exactly the same as setting it to 0. This works for the purposed of declaring null pointers because the memory at address 0 will never be allocated to your program.

OTHER TIPS

When you print a pointer using printf("%p", somePtr), it is printed in an implementation-defined manner, as per this quote from the POSIX printf specification (similar wording exists in the C99 specification also).

The argument must be a pointer to void. The value of the pointer is converted to a sequence of printable characters, in an implementation-dependent manner.

I guess, that this means if the pointer is NULL, it may print it however it wants, including printing it as nil or 0x00000000 or 0.

use

printf("Head: %s, %d, %p\n", front, front, front);

to print Head: (null), 0, (nil)

Thanks Packia

I'm assuming that nil is what your debugger is telling you. In most compilers null is just #define ed to 0 anyway so that name is not that important.

As others have stated, there is no such thing as nil pointer in C.

May be your memory allocation fails, causing 0 to be assigned to the pointer.

If your question is about comparing the pointer value to NULL then the value printed by printf() shouldn't matter. You can still do if(ptr==NULL) for that.

    ptr = (nil) and NULL = (nil) => ptr = NULL :)

The error you are getting must because of some other reason.

After casting the structure pointer with int , it provides the expected condition with if statement ..

printf("The address of the variable is---ps->p---After Deletion-- %p \n",ps->p);
printf("The address of the variable is---ps->p---After Deletion--  %d \n",(int)ps->p);
if((int)ps->p){
printf("Again in Free\n");
doFree((void **)&ps->p);
}

OUTPUT :-

The address of the variable is---ps->p---After Deletion-- nil The address of the variable is---ps->p---After Deletion-- 0

it will evaluates to false for if condition .

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top