How to printf a memory address in C

后端 未结 2 1011
名媛妹妹
名媛妹妹 2020-11-28 13:53

My code is:

#include 
#include 

void main()
    {
    char string[10];
    int A = -73;
    unsigned int B = 31337;

    strc         


        
相关标签:
2条回答
  • 2020-11-28 14:51

    A workaround to use %x with length specifier to print an int or unsigned int without compiler complaining about casting would be to use malloc:

    unsigned int* D = malloc(sizeof(unsigned int)); // Allocate D
    unsigned int D_address = *((unsigned int*) &D); // D address for %08x without warning
    *D = 75; // D value
    printf("variable D is at address: %p / 0x%08x with value: %u\n", D, D_address, *D);
    

    Alternatively you can compile with gcc -w flag to suppress those casting warnings.

    0 讨论(0)
  • 2020-11-28 14:57

    Use the format specifier %p:

    printf("variable A is at address: %p\n", (void*)&A);
    

    The standard requires that the argument is of type void* for %p specifier. Since, printf is a variadic function, there's no implicit conversion to void * from T * which would happen implicitly for any non-variadic functions in C. Hence, the cast is required. To quote the standard:

    7.21.6 Formatted input/output functions (C11 draft)

    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.

    Whereas you are using %x, which expects unsigned int whereas &A is of type int *. You can read about format specifiers for printf from the manual. Format specifier mismatch in printf leads to undefined behaviour.

    0 讨论(0)
提交回复
热议问题