Я заметил кое-что странное после компиляции этого кода на моей машине:
#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 и длинным 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
.