Я помітив щось дивне після складання цього коду на своїй машині:
#include <stdio.h>
int main()
{
printf("Hello, World!\n");
int a,b,c,d;
int e,f,g;
long int h;
printf("The addresses are:\n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x \n %0x",
&a,&b,&c,&d,&e,&f,&g,&h);
return 0;
}
Результат такий. Зауважте, що між кожною адресою int існує 4-байтна різниця. Однак між останнім int та long int є різниця у 12 байтів:
Hello, World!
The addresses are:
da54dcac
da54dca8
da54dca4
da54dca0
da54dc9c
da54dc98
da54dc94
da54dc88
sizeof
функція. printf("size: %d ", sizeof(long));
%x
. На щастя, вам трапляється правильно працювати на вашій платформі, щоб передавати вказівні аргументи з очікуваним рядком формату unsigned int
, але вказівники та вставки мають різні розміри у багатьох ABI. Використовуйте %p
для друку покажчиків у портативному коді. (Неважко уявити систему, де ваш код надрукував би верхню / нижню половинки перших 4 вказівників, а не нижню половину всіх 8.)
%zu
. @yoyo_fun для друку використання адрес%p
. Використання неправильного специфікатора формату викликає невизначене поведінку
int
післяh
у вихідний код. Компілятор може поставити його в пробіл ранішеh
.