3

When I'm writing this code:

#include <stdio.h>

int main()
{
    printf("%p\n",main);
    printf("%d\n",main);
    return 0;
}

my compiler shows me this output:

00401318
4199192

I'm interested to know what actually is printed. I googled my question, but have found nothing. :(

Thanks in advance.

4
  • 1
    stackoverflow.com/questions/2741683/… Commented Dec 10, 2014 at 14:47
  • The first one prints the address of the function, the second one would print the address of the function if sizeof(void*) is equal to sizeof(int) on your platform, but it is generally considered as undefined behavior. Commented Dec 10, 2014 at 14:48
  • @TheBigH, I didn't know the term function pointer. Commented Dec 10, 2014 at 14:49
  • Not coincidentally, 0x401318 == 4199192. Commented Dec 10, 2014 at 14:50

2 Answers 2

4

This is not well-defined.

You're using %p, which expects an argument of type void *, but you're actually passing it a value of type int (*)(), i.e. your (also badly defined) main() function.

You cannot portably cast a function pointer to void *, so your code can never be correct.

On most typicaly systems, sizeof (void *) == sizeof main, so you simply get the value interpreted as a void * which probably will simply be the address of the function.

Passing a function address to printf() with a format specifier of %d is even worse, since it's quite likely that sizeof (int) != sizeof main and then you get undefined behavior.

This is not good code.

Sign up to request clarification or add additional context in comments.

Comments

4

main is a function pointer of type int(*)(void)

  1. printf("%p\n", main);

You are printing the address of that pointer, which, on your platform has been successfully cast to a void*. This will be fine if sizeof(main) == sizeof(void*).

  1. printf("%d\n", main);

This will give you undefined behaviour since %d is not a good format specifier for a pointer type.

7 Comments

What's about %d specifier ?
OP is printing the value of the pointer (which is the address of the function), not the address of the pointer. In addition, the second call to printf is guaranteed to work correctly only if sizeof(void*) is equal to sizeof(int) on OP's platform, but it is generally considered as undefined behavior. One last thing - I'm not the one who downvoted you for this answer, so please don't go around downvoting random answers of my own.
They are the same values. %p formats it as hex, and %d formats as decimal. 0x401318 == 4199192
@robert: That's not true. For example, if OP is running on a 64-bit platform (64GB memory address space), then %p would be equivalent to %lld (or more precisely, to %llx).
Downvoted for "%p should be fine though". Function pointers are not compatible with void* pointers.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.