Printing the address of a struct object

15,059

Solution 1

%x expects an unsigned. What you're printing is a pointer. To do that correctly, you normally want to use %p. To be pedantically correct, that expects a pointer to void, so you'll need to cast it:

printf("%p\n", (void *)val);

In reality, most current implementations use the same format for all pointers, in which case the cast will be vacuous. Of course, given the C++ tag, most of the code you've included becomes questionable at best (other than the parts like LPSOMESTRUCT, which are questionable regardless). In C++, you normally want something more like:

struct somestruct { 
   int a;
   int b;
};

somestruct *val = new somestruct; // even this is questionable.

std::cout << val;

Solution 2

Use the %p format specifier to print a pointer.

printf("%p\n", val);

Solution 3

If you want to cast then using reinterpret_cast instead of static_cast might do the trick here.

With printf try using the %zu instead of %x for printing out a pointer because the pointer is of unsigned integer type (ie %zu).

printf("%zu \n", val);

Just one other thing, being a c++ program is there a reason why you are using malloc instead of new?

Share:
15,059
bdhar
Author by

bdhar

Updated on June 04, 2022

Comments

  • bdhar
    bdhar almost 2 years

    I have a struct like this

    typedef struct _somestruct {
        int a;
        int b;
    }SOMESTRUCT,*LPSOMESTRUCT;
    

    I am creating an object for the struct and trying to print it's address like this

    int main()
    {
        LPSOMESTRUCT val = (LPSOMESTRUCT)malloc(sizeof(SOMESTRUCT));
    
        printf("0%x\n", val);
    
        return 0;
    }
    

    ..and I get this warning

    warning C4313: 'printf' : '%x' in format string conflicts with argument 1 of type 'LPSOMESTRUCT'

    So, I tried to cast the address to int like this

    printf("0%x\n", static_cast<int>(val));
    

    But I get this error:

    error C2440: 'static_cast' : cannot convert from 'LPSOMESTRUCT' to 'int'

    What am I missing here? How to avoid this warning?

    Thanks.