使用适当的地址和数据为C创建堆栈的图形

问题描述

我正在尝试绘制一个堆栈,其中过程的底部为0xffff。程序很简单:

…
std::cout << "Hello World!\n";
…

当我创建一个示例程序来查找地址时,我得到了:

iArr [0]:0x7ffce0c79970

iArr [1]:0x7ffce0c79974

iArr [2]:0x7ffce0c79978

iArr [3]:0x7ffce0c7997c

d:0x7ffce0c79980

i:0x7ffce0c79988

c:0x7ffce0c7998f

sizeof()函数说整数是4个字节,那为什么我要从88转到88e?另外,如果假定过程的最低点为0xffff,则c将从0xffff还是0xfffe开始?

解决方法

您需要考虑 alignment alignof)和 size 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数组以尽可能最高的对齐方式分配为连续的内存块,但是索引以与堆栈相反的顺序工作,它们总是递增计数,因此看起来很奇怪,但也很有意义。