Home > Software design >  What does int* ip = (int *)p mean?
What does int* ip = (int *)p mean?

Time:06-27

#include <stdio.h>

int main(){
    char p[5] = "ABCD"; 
    int* ip = (int *)p;
    printf("%d \n", *(ip   0)); // 1145258561 
    printf("%d \n", ip); // 6422016
}

Could anybody please explain to me the output of this program?

CodePudding user response:

Here you cast the char[4], p, into an int* and initialize ip with the result:

    int* ip = (int *)p;

Here you dereference ip, which, since it's an int* means that it will read sizeof(int) bytes to form an int from the address ip points at:

    printf("%d \n", *(ip   0)); // 1145258561 

Since ints are often 4 bytes, it will often work. If an int is 8 bytes, the program would have undefined behavior since it would then read outside the char[4].

Here you print the value if ip as an int, but it is a pointer, which often has the size 8. It will therefore likely cause undefined behavior.

    printf("%d \n", ip); // 6422016

To properly print pointers, use %p and cast the pointer to void*:

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

CodePudding user response:

The string (char array) p is casted as int pointer ip.

Each c-char has a length of 8 bit, each c-int a length of 32 bit. This is why you could cast your 4 chars to one int.

If you print *(ip 0) you print the value of the pointer at it's first address (The char values converted to int).

Printing ip gives you the pointer name itself.

If you'd print &ip you'd get the address of the first element of the pointer.

  • Related