使用正确的地址和数据为 C 创建堆栈图
Creating a drawing of a stack for C with proper addresses and data
我正在尝试绘制进程底部为 0xffff 的堆栈。程序简单:
int main() {
char c;
int i;
double d;
int iArr[4];
return 0;
}
当我为地址示例创建程序时,我得到:
iArr[0]: 0x7ffce0c79970
iArr[1]: 0x7ffce0c79974
iArr[2]: 0x7ffce0c79978
iArr[3]: 0x7ffce0c7997c
d: 0x7ffce0c79980
我:0x7ffce0c79988
c: 0x7ffce0c7998f
sizeof() 函数说整数是 4 个字节,那么为什么我要从 88 变成 88e?还有,假设进程的底部是0xffff,c是从0xffff还是0xfffe开始?
您将需要考虑 对齐方式 (alignof
) 以及 大小 (sizeof
) 因为某些类型必须在特定的内存地址上对齐,否则 CPU 无法处理。
例如,int
必须位于 4 字节的倍数的地址上,double
必须位于 8 的倍数上,等等。而 char
只能是一个字节任何地方。
如果将堆栈形象化,您会看到它:
| | | | | | | | |
+----+----+----+----+----+----+----+----+
...9970 | iArr[0] | iArr[1] |
+----+----+----+----+----+----+----+----+
...9978 | iArr[2] | iArr[3] |
+----+----+----+----+----+----+----+----+
...9980 | d |
+----+----+----+----+----+----+----+----+
...9988 | i | | | | c |
+----+----+----+----+----+----+----+----+
这是有道理的,因为堆栈倾向于 向下增长 ,即较早的条目具有较高的内存地址。所以 c
获得最高地址,然后 i
获得下一个可能的最高地址,考虑对齐,等等。 iArr
数组以尽可能高的对齐方式分配为连续的内存块,但索引的工作顺序与堆栈相反,它们总是向上计数,所以这看起来很奇怪但也很有意义。
我正在尝试绘制进程底部为 0xffff 的堆栈。程序简单:
int main() {
char c;
int i;
double d;
int iArr[4];
return 0;
}
当我为地址示例创建程序时,我得到:
iArr[0]: 0x7ffce0c79970
iArr[1]: 0x7ffce0c79974
iArr[2]: 0x7ffce0c79978
iArr[3]: 0x7ffce0c7997c
d: 0x7ffce0c79980
我:0x7ffce0c79988
c: 0x7ffce0c7998f
sizeof() 函数说整数是 4 个字节,那么为什么我要从 88 变成 88e?还有,假设进程的底部是0xffff,c是从0xffff还是0xfffe开始?
您将需要考虑 对齐方式 (alignof
) 以及 大小 (sizeof
) 因为某些类型必须在特定的内存地址上对齐,否则 CPU 无法处理。
例如,int
必须位于 4 字节的倍数的地址上,double
必须位于 8 的倍数上,等等。而 char
只能是一个字节任何地方。
如果将堆栈形象化,您会看到它:
| | | | | | | | |
+----+----+----+----+----+----+----+----+
...9970 | iArr[0] | iArr[1] |
+----+----+----+----+----+----+----+----+
...9978 | iArr[2] | iArr[3] |
+----+----+----+----+----+----+----+----+
...9980 | d |
+----+----+----+----+----+----+----+----+
...9988 | i | | | | c |
+----+----+----+----+----+----+----+----+
这是有道理的,因为堆栈倾向于 向下增长 ,即较早的条目具有较高的内存地址。所以 c
获得最高地址,然后 i
获得下一个可能的最高地址,考虑对齐,等等。 iArr
数组以尽可能高的对齐方式分配为连续的内存块,但索引的工作顺序与堆栈相反,它们总是向上计数,所以这看起来很奇怪但也很有意义。