为什么概念存储分配与实际存储分配不同?

时间:2016-05-14 14:56:15

标签: c++ c arrays memory static-memory-allocation

我有一个令人费解的问题(至少对我而言)

假设我声明了一个整数数组:

int arr[3];

从概念上讲,内存中发生的事情是,在编译时,分配12个字节来存储3个连续的整数,对吗? (Here's an illustration

根据插图,

的样本地址

arr[0]1000

arr[1]1004

arr[2]1008

我的问题是:

如果我输出arr[0]arr[1]地址之间的差异:

std::cout << &arr[1] - &arr[0] << std::endl;

而非获取4

我惊讶地得到1

有人可以解释为什么会产生这个输出吗?

PS:在我的计算机上,int是4个字节。

1 个答案:

答案 0 :(得分:0)

指针算术会自动将值除以基类型的大小,因此这一点都不奇怪,因为人们期望得到4 / 4 1。转换为unsignd char *以查看差异。

#include <iostream>

int
main(void)
{
    int arr[2];

    std::cout << &arr[1] - &arr[0] << std::endl;
    std::cout << reinterpret_cast<unsigned char *>(&arr[1]) -
        reinterpret_cast<unsigned char *>(&arr[0]) << std::endl;

    return 0;
}