首先,我说的是 32 位架构。我的教授给我们举了一个例子,说明如何存储 C/C++ 32 位整数的地址,地址为 0A0B0C0D
,整数的第一个字节存储在 0x0A
,第二个在 0x0B
,第三个在 0x0C
,第四个在 0x0D
。但是,我在 C++ 中尝试了以下代码:
#include <iostream>
int main(){
int a = 5;
std::cout << &a;
}
我得到了 0x7fffba2e6c3c
。然而,这看起来不像教授给我们的例子那样字节是连续的。我的问题是,为什么编译器不将整数的 4 个字节存储在连续的内存地址中,而是将整数中的每个字节存储在不同的地址中?
最佳答案
and have an address as 0A0B0C0D with the first byte of the integer being stored at 0x0A
这里似乎有些困惑。
如果一个整数的第一个字节存放在0x0A,那么整个整数的地址就是0x0A。 0A0B0C0D 似乎是作为该整数一部分的字节地址的某种串联。
或者相反,如果整数的地址是0x0A0B0C0D,那么第一个字节的地址也是0x0A0B0C0D,第二个是0x0A0B0C0E等等。
I got 0x7fffba2e6c3c. However, this doesn't look like the bytes are contiguous
您已经打印了整数的地址。您无法从地址判断该地址处的对象是否连续。例如,如果您像教授示例中那样得到 0x0A,您将如何确定后续字节是或不是 0x0B?
你不能从地址得出这样的结论,但你只需要假设相邻。
Is it a must that an integer must be stored in contiguous memory addresses?
是的。所有对象在内存中都是连续的。 (请注意,一个对象可以包含单独对象的地址,这些地址不一定相对于持有指针的对象连续存储。因此,例如,链表对象不会连续存储列表的元素,但每个节点列表本身是连续的)。
关于c++ - 整数必须存储在连续的内存地址中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608320/