如何解决使用适当的地址和数据为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 举报,一经查实,本站将立刻删除。