使用正确的地址和数据为 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 数组以尽可能高的对齐方式分配为连续的内存块,但索引的工作顺序与堆栈相反,它们总是向上计数,所以这看起来很奇怪但也很有意义。