gpt4 book ai didi

c - 这段代码是如何占用内存的?

转载 作者:行者123 更新时间:2023-12-02 06:47:00 24 4
gpt4 key购买 nike

我是 C 的新手,我想了解编译器是如何分配内存的。这是我为了解正在发生的事情而编写的一段代码:

#include<stdio.h>
int main(void){
int x=10;
char y='A';
printf("x: %p \ny: %p\n", &x, &y);
return 0;
}

输出:

x: 0x7fffcc33e10c
y: 0x7fffcc33e10b

Int占4bytes,Char占1byte。那么这些变量存放的位置怎么会是连续的呢?我无法理解这一点。

编辑:

正如@Rup 在下面的评论中所建议的那样,我尝试在代码中添加更多整数:

#include<stdio.h>
int main(void){
int x=10;
int m = 11;
int n = 11;
int o = 11;
char y='A';
printf("x: %p \nm: %p\nn: %p\no: %p\ny: %p\n", &x, &m, &n, &o, &y);
return 0;
}

我得到了以下输出:

x: 0x7fff825c2e68
m: 0x7fff825c2e6c
n: 0x7fff825c2e70
o: 0x7fff825c2e74
y: 0x7fff825c2e67

y 的空间分配为 1 个字节,x、m、n、o 整数分配为 4 个字节。感谢您的所有回复。

最佳答案

如何为变量分配内存完全是实现的一个函数——答案因平台而异。变量不必按照声明的顺序排列,并且根据对齐要求,一个变量的末尾和另一个变量的开头之间可能存在“空洞”(未使用的字节)。

这是您的系统上可能发生的情况(所有字节值均为十六进制格式):

   +----+
y: | 41 | 0x7fffcc33e10b
+----+
x: | 0a | 0x7fffcc33e10c // assuming little-endian representation
+----+
| 00 | 0x7fffcc33e10d
+----+
| 00 | 0x7fffcc33e10e
+----+
| 00 | 0x7fffcc33e10f
+----+

在 x86 和类似的平台上,堆栈向递减的地址“向下”增长(x86 也是小尾数法,因此寻址字节是多字节对象的最低有效字节)。因此,x 被“首先”分配到地址 0x7fffcc33e10c,然后 y 被分配到下一个可用的对象地址。由于 y 是一个 char 并且只有一个字节宽,下一个可用地址是 0x7fffcc33e10b。如果 y 也是一个 4 字节的 int,那么下一个可用地址将是 0x7fffcc33e108,布局将是这样的:

   +----+
y: | 41 | 0x7fffcc33e108
+----+
| 00 | 0x7fffcc33e109
+----+
| 00 | 0x7fffcc33e10a
+----+
| 00 | 0x7fffcc33e10b
+----+
x: | 0a | 0x7fffcc33e10c
+----+
| 00 | 0x7fffcc33e10d
+----+
| 00 | 0x7fffcc33e10e
+----+
| 00 | 0x7fffcc33e10f
+----+

编辑

一个有趣的练习是声明

int x = 10;
char y = 'A';
int z = 20;

看看它们是如何布局的。如果它们按照声明的顺序排列,那么您可能会在 yz 之间看到一个或多个未使用的字节,因为大多数平台要求多字节对象从偶地址。如果编译器决定将它们布局为 xzy,我不会感到惊讶,因为这样可以最大限度地减少任何此类“漏洞” ”。

编辑的编辑

自己试了一下,结果如下:

       Item         Address   00   01   02   03
---- ------- -- -- -- --
x 0x7ffee73b8a78 0a 00 00 00 ....

y 0x7ffee73b8a77 41 0a 00 00 A...

z 0x7ffee73b8a70 14 00 00 00 ....

yz 之间有三个未使用的字节,因此 4 字节对象显然必须与 4 的倍数的地址对齐。图形上,我们有

    +----+
z : | 14 | 0x7ffee73b8a70
+----+
| 00 | 0x7ffee73b8a71
+----+
| 00 | 0x7ffee73b8a72
+----+
| 00 | 0x7ffee73b8a73
+----+
| ?? | 0x7ffee73b8a74
+----+
| ?? | 0x7ffee73b8a75
+----+
| ?? | 0x7ffee73b8a76
+----+
y: | 41 | 0x7ffee73b8a77
+----+
x: | 0a | 0x7ffee73b8a78
+----+
| 00 | 0x7ffee73b8a79
+----+
| 00 | 0x7ffee73b8a7a
+----+
| 00 | 0x7ffee73b8a7b
+----+

关于c - 这段代码是如何占用内存的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56832438/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com