微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用适当的地址和数据为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数组以尽可能最高的对齐方式分配为连续的内存块,但是索引以与堆栈相反的顺序工作,它们总是递增计数,因此看起来很奇怪,但也很有意义。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。