Если вы хотите привести значение указателя к целочисленному типу, вы должны использовать intptr_t
или uintptr_t
, что гарантирует, что целое число будет достаточно большим, чтобы содержать любое возможное значение указателя.
Вы можетекомпилируйте свой код для 32-битной архитектуры, или вам может повезти, так как ваш стек расположен в нижней части адресного пространства (хотя это маловероятно), так что в вашем исполнении наиболее значимые биты адреса равны 0.
См. https://en.cppreference.com/w/c/types/integer
Код (https://ideone.com/2NDYnP):
#include <stdio.h> // printf
#include <stdint.h> // intptr_t, uintptr_t
#include <inttypes.h> // PRIdPTR, PRIuPTR
int main() {
int i=3;
// Incorrect
printf("unsighed value of &i = %u \n",(unsigned int)&i);
printf("int value of &i = %d\n",(int)&i);
// Correct
printf("pointer Address of i = %p\n",&i);
printf("uintptr_t value of &i = %"PRIuPTR"\n", (uintptr_t)&i);
printf("intptr_t value of &i = %"PRIdPTR"\n", (intptr_t)&i);
printf("Value of i = %d\n",i);
return 0;
}
Результат:
unsighed value of &i = 3131233804
int value of &i = -1163733492
pointer Address of i = 0x7fffbaa2d60c
uintptr_t value of &i = 140736324621836
intptr_t value of &i = 140736324621836
Value of i = 3