理解 C 中分配给大小大于 1 的数组的地址差异

问题描述 投票:0回答:1

我正在了解如何在 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?

尺寸 2 arr
尺寸 1 arr

int main(int argc, char* argv[]) {

int a;
int arr[1];
printf("地址 a: %p (%lu) ", &a, (unsigned long)&a);
printf("地址 arr[0]: %p (%lu) ", arr, (unsigned long)arr);
printf("地址 arr[1]: %p (%lu) ", &arr[1], (unsigned long)&arr[1]);>
}

地址a:0x7ff7b1fd60cc(140701819822284)
地址arr[0]:0x7ff7b1fd60c8(140701819822280)
地址arr[1]:0x7ff7b1fd60cc(140701819822284)
int main(int argc, char* argv[]) {
 int a;
int arr[2];
printf("地址 a: %p (%lu) ", &a, (unsigned long)&a);
printf("地址 arr[0]: %p (%lu) ", arr, (unsigned long)arr);
printf("地址 arr[1]: %p (%lu) ", &arr[1], (unsigned long)&arr[1]);
}


地址a:0x7ff7b3d970bc(140701851021500)
地址arr[0]:0x7ff7b3d970d0(140701851021520)
地址arr[1]:0x7ff7b3d970d4(14070⁘⁘24)0215


int a; int arr[3];
arrays c pointers
1个回答
0
投票
a
在地址 100。那么
arr
将在地址

96

 (100 - 4),而 
arr[3]
 的地址在 88 (96 - 2 * 4),因为 int 将占用 4 个字节.
没有。就这么简单:C 在声明变量时没有说明任何关于内存布局的信息(这对于在 
struct
s 中声明的字段是不同的)。

你不会在

a

arr

上做一个操作,实际上需要将它们移动到内存中(通过获取它们的地址并用它做一些事情,你强制它们有一个地址!),没有因为他们有一个正确的内存地址。

© www.soinside.com 2019 - 2024. All rights reserved.