Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 7172807
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 28, 20262026-05-28T15:41:34+00:00 2026-05-28T15:41:34+00:00

Which format specifier should I be using to print the address of a variable?

  • 0

Which format specifier should I be using to print the address of a variable? I am confused between the below lot.

%u – unsigned integer

%x – hexadecimal value

%p – void pointer

Which would be the optimum format to print an address?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-28T15:41:34+00:00Added an answer on May 28, 2026 at 3:41 pm

    The simplest answer, assuming you don’t mind the vagaries and variations in format between different platforms, is the standard %p notation.

    The C99 standard (ISO/IEC 9899:1999) says in §7.19.6.1 ¶8:

    p The argument shall be a pointer to void. The value of the pointer is
    converted to a sequence of printing characters, in an implementation-defined
    manner.

    (In C11 — ISO/IEC 9899:2011 — the information is in §7.21.6.1 ¶8.)

    On some platforms, that will include a leading 0x and on others it won’t, and the letters could be in lower-case or upper-case, and the C standard doesn’t even define that it shall be hexadecimal output though I know of no implementation where it is not.

    It is somewhat open to debate whether you should explicitly convert the pointers with a (void *) cast. It is being explicit, which is usually good (so it is what I do), and the standard says ‘the argument shall be a pointer to void‘. On most machines, you would get away with omitting an explicit cast. However, it would matter on a machine where the bit representation of a char * address for a given memory location is different from the ‘anything else pointer‘ address for the same memory location. This would be a word-addressed, instead of byte-addressed, machine. Such machines are not common (probably not available) these days, but the first machine I worked on after university was one such (ICL Perq).

    If you aren’t happy with the implementation-defined behaviour of %p, then use C99 <inttypes.h> and uintptr_t instead:

    printf("0x%" PRIXPTR "\n", (uintptr_t)your_pointer);
    

    This allows you to fine-tune the representation to suit yourself. I chose to have the hex digits in upper-case so that the number is uniformly the same height and the characteristic dip at the start of 0xA1B2CDEF appears thus, not like 0xa1b2cdef which dips up and down along the number too. Your choice though, within very broad limits. The (uintptr_t) cast is unambiguously recommended by GCC when it can read the format string at compile time. I think it is correct to request the cast, though I’m sure there are some who would ignore the warning and get away with it most of the time.


    Kerrek asks in the comments:

    I’m a bit confused about standard promotions and variadic arguments. Do all pointers get standard-promoted to void*? Otherwise, if int* were, say, two bytes, and void* were 4 bytes, then it’d clearly be an error to read four bytes from the argument, non?

    I was under the illusion that the C standard says that all object pointers must be the same size, so void * and int * cannot be different sizes. However, what I think is the relevant section of the C99 standard is not so emphatic (though I don’t know of an implementation where what I suggested is true is actually false):

    §6.2.5 Types

    ¶26 A pointer to void shall have the same representation and alignment requirements as a pointer to a character type.39) Similarly, pointers to qualified or unqualified versions of compatible types shall have the same representation and alignment requirements. All pointers to structure types shall have the same representation and alignment requirements as each other. All pointers to union types shall have the same representation and alignment requirements as each other. Pointers to other types need not have the same representation or alignment requirements.

    39) The same representation and alignment requirements are meant to imply interchangeability as arguments to functions, return values from functions, and members of unions.

    (C11 says exactly the same in the section §6.2.5, ¶28, and footnote 48.)

    So, all pointers to structures must be the same size as each other, and must share the same alignment requirements, even though the structures the pointers point at may have different alignment requirements. Similarly for unions. Character pointers and void pointers must have the same size and alignment requirements. Pointers to variations on int (meaning unsigned int and signed int) must have the same size and alignment requirements as each other; similarly for other types. But the C standard doesn’t formally say that sizeof(int *) == sizeof(void *). Oh well, SO is good for making you inspect your assumptions.

    The C standard definitively does not require function pointers to be the same size as object pointers. That was necessary not to break the different memory models on DOS-like systems. There you could have 16-bit data pointers but 32-bit function pointers, or vice versa. This is why the C standard does not mandate that function pointers can be converted to object pointers and vice versa.

    Fortunately (for programmers targetting POSIX), POSIX steps into the breach and does mandate that function pointers and data pointers are the same size:

    §2.12.3 Pointer Types

    All function pointer types shall have the same representation as the type pointer to void. Conversion of a function pointer to void * shall not alter the representation. A void * value resulting from such a conversion can be converted back to the original function pointer type, using an explicit cast, without loss of information.

    Note:
    The ISO C standard does not require this, but it is required for POSIX conformance.

    So, it does seem that explicit casts to void * are strongly advisable for maximum reliability in the code when passing a pointer to a variadic function such as printf(). On POSIX systems, it is safe to cast a function pointer to a void pointer for printing. On other systems, it is not necessarily safe to do that, nor is it necessarily safe to pass pointers other than void * without a cast.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

android.text.format.DateFormat specifies that using the format string 'a' should yield 'a' or 'p' and
I want to know in which format the contact details are stored in android
I run the following Gert's extract command to the data dump file which format
Does anybody know which date format is to be used, trying to create a
I have a custom XML file format which can contain blocks of code within
I have XML in the following format which I want to reformat: <blocks> <!--
Word 2007 saves its documents in .docx format which is really a zip file
I need to make custom text field which will format numeric values according to
I would like to ask for a recommendation on offline form format which user
I need an expression which matches,DateTime format (DD/MM/YYYY),i've already found it. However,it only works

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.