polynomial_donut
polynomial_donut

Reputation: 303

Why does printf literally print (null) and what exactly happens?

in a C programming exercise I'm doing something like this (just simplifying):

printf( "%s", 0);

The output is

(null)

What happens here? I assume that printf interprets the zero as a char *, so to NULL? How could I replicate this result by something like

char string[] = NULL; //compiler-error
printf( "%s", string);

?

Upvotes: 5

Views: 7694

Answers (4)

AnT stands with Russia
AnT stands with Russia

Reputation: 320631

Firstly, your

printf("%s", 0);

leads to undefined behavior (UB). %s in printf requires a char * pointer as argument. You are passing 0, which is an int. That alone already breaks your code, just like

printf("%s", 42); 

would. For that specific UB the fact that 0 is a zero does not make any difference.

Secondly, if you really want to attempt to pass a null-ponter to %s format specifier, you have to do something like

printf("%s", (char *) 0);

Of course, this leads to undefined behavior as well, since %s requires a pointer to a valid string as argument, and (char *) 0 is not a valid string pointer. But some implementations prefer to handle such situations gracefully and just print (null).

In your particular case you just got lucky: printf("%s", 0) "worked" the same way as printf("%s", (char *) 0) would and your implementation saved the day by outputting (null).

Upvotes: 6

Steve Summit
Steve Summit

Reputation: 48020

As others have noted, passing a null pointer to printf %s is not guaranteed to do anything. Everything else being equal, we would expect a segmentation violation or other ungraceful crash, as printf attempts to dereference the null pointer. As a convenience, however, many (most?) implementations of printf have, somewhere deep within them, the equivalent of

case 's':
    char *p = va_arg(argp, char *);
    if(p == NULL) p = "(null)";
    fputs(p, stdout);

Upvotes: 2

Lawrence Aiello
Lawrence Aiello

Reputation: 4638

In your example, passing 0 to printf results in undefined behavior because the format-specifier you have says it prints a string, but you gave it an int. To replicate, you can do this:

char *string = NULL;
printf("%s", string);

Upvotes: 1

Greg Hewgill
Greg Hewgill

Reputation: 993941

You can also do this using something like:

char *string = NULL;

printf("%s", string);

Many implementations of printf() will print (null) or something similar when passed a NULL pointer to %s. But they don't have to do that (it's not required by the standard).

Upvotes: 1

Related Questions