我正在了解如何在 C 中为局部变量分配内存。基于 this,数组将在堆栈上创建。而且我认为堆栈寻址从较高地址开始,然后转到较低地址。所以说我有这个:
int a;
int arr[3];
说
a
在地址 100。那么 arr
将在地址 96
(100 - 4),而 arr[3]
的地址在 88 (96 - 2 * 4),因为 int 将占用 4 个字节.
但在现实中,我看到一些非常不同的事情正在发生。如果我制作一个大小为 1 的 arr,那么它会按预期工作。但是,如果我增加数组大小,那么地址看起来会非常不同。
似乎大小 > 1 的数组没有进入堆栈,而是进入其他地方(堆?)。有人可以向我解释
a
和 arr
之间的地址差距吗?大小> 1?
尺寸 1 arr |
---|
|
|
int main(int argc, char* argv[]) {int a; |
地址a:0x7ff7b3d970bc(140701851021500)地址arr[0]:0x7ff7b3d970d0(140701851021520) |
int a;
int arr[3];
a
在地址 100。那么你不会在将在地址arr
96
(100 - 4),而arr[3]
的地址在 88 (96 - 2 * 4),因为 int 将占用 4 个字节.没有。就这么简单:C 在声明变量时没有说明任何关于内存布局的信息(这对于在s 中声明的字段是不同的)。struct
a
和
arr
上做一个操作,实际上需要将它们移动到内存中(通过获取它们的地址并用它做一些事情,你强制它们有一个地址!),没有因为他们有一个正确的内存地址。