В то время как вы уже находитесь в области неопределенного поведения (см. Некоторые программисты чувак ' ответ ) из-за индексации массива вне границ (одна переменная считается массив длины 1 для таких вопросов), некоторые технические знания:
Выравнивание! Компиляторам разрешено размещать переменные по адресам так, чтобы к ним можно было обращаться наиболее эффективно. Поскольку вы , кажется, получили действительный вывод, добавив 2*sizeof(int)
к адресу второй переменной, вы, очевидно, достигли первого случайно . По-видимому, компилятор решил оставить пробел между двумя переменными, чтобы обе можно было выровнять по адресам, кратным 8.
Имейте в виду, однако, что у вас нет никакой гарантии для такого выравнивания, разные компиляторы могут решить по-разному (или один и тот же компилятор в другой системе), и выравнивание даже может быть изменено с помощью флагов компилятора.
С другой стороны, массивы гарантированно занимают непрерывную память, поэтому вы могли бы получить ожидаемый результат в следующем примере:
int array[2];
int* a0 = &array[0];
int* a1 = &array[1];
uintptr_t diff = static_cast<uintptr_t>(a1) - static_cast<uintptr_t>(a0);
std::cout << diff;
Приведение к uintptr_t
(или к char*
) обеспечивает получение разницы адресов в байтах, а не в размерах int
...