免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4529 | 回复: 12
打印 上一主题 下一主题

vc的栈变量的地址似乎不是按整型对齐,为什么? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-20 10:10 |只看该作者 |倒序浏览
5可用积分
我在VC2010下面写了几行程序(release版):

  1. #include<iostream>
  2. using namespace std;
  3. int main(void){
  4.     int i=22;
  5.     int j=33;
  6.     int k=44;
  7.     int* pi=&i;
  8.     cout<<pi[0]<<pi[1]<<pi[2]<<endl;
  9. }
复制代码
我期待的打印结果是223344
但是实际的结果是:
2220244823651245120

我尝试了GCC在64位Centos6.2下面,打印结果就是223344

这是为什么呢? 难道在VC的程序栈上面i,j,k不是连续分配的? 为什么呢?

最佳答案

查看完整内容

想要连续分配就明确地,以C或C++语言的方式告之编译器:无论你怎么搞它都是连续的。而对代码:你所期待的结果 —— 223344 —— 只是你的想象,而不是C或C++语言的规定。你就没有将你所需要的布局告之编译器,甚至连它们是否有空间都是未知的。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
2 [报告]
发表于 2012-04-20 10:10 |只看该作者
想要连续分配就明确地,以C或C++语言的方式告之编译器:

  1. int i[] = {22,33,44};
  2. int* pi = i;
复制代码
无论你怎么搞它都是连续的。


而对代码:

  1. int i = 22;
  2. int j = 33;
  3. int k = 44;
复制代码
你所期待的结果 —— 223344 —— 只是你的想象,而不是C或C++语言的规定。
你就没有将你所需要的布局告之编译器,甚至连它们是否有空间都是未知的。

论坛徽章:
324
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
3 [报告]
发表于 2012-04-20 10:23 |只看该作者
编译器会调整变量次序的

论坛徽章:
0
4 [报告]
发表于 2012-04-20 10:25 |只看该作者
  1. #include<iostream>
  2. using namespace std;
  3. int main(void){
  4.     int i=22;
  5.     int j=33;
  6.     int k=44;
  7.     int* pi=&i;
  8.     cout<<pi[0]<<pi[1]<<pi[2]<<endl;

  9.          pi=&k;
  10.     cout<<pi[0]<<pi[1]<<pi[2]<<endl;


  11.     cout<<&i<<" "<<&j<<" "<<&k<<endl;
  12. }

  13. VC6的结果
  14. 2212451204333993
  15. 443322
  16. 0012FF7C 0012FF78 0012FF74
复制代码
变量地址是否对其,应该打印变量地址出来,而不是像你那样做。

我没研究过C标准里面有没有关于“函数中局部变量的存放的布局问题”,
也不知道有没有这方面的描述,
不过从我看过的书里面还没有提到过这方面知识。

你的做法,显然认为i的地址小于j,但是我用的vc6与你的假设相反。





论坛徽章:
0
5 [报告]
发表于 2012-04-20 10:47 |只看该作者
4楼说的不错
栈是往下增长的,也就是说先分配的变量的地址会大些,后分配的会小些
p = &i;  
p,p+1,p+2却是正常增长的,地址递增

这样的话p[0]、p[1] 、p[2]肯定与栈里面的i、j、k是不对应的
得出LZ那样的结果也就不为奇了!

论坛徽章:
0
6 [报告]
发表于 2012-04-20 10:50 |只看该作者
至于为什么Own所说的数组可以呢
那是因为不管是栈还是堆
都要保证分配的数组的正常结构,就是数组下标小的地址小

论坛徽章:
0
7 [报告]
发表于 2012-04-20 15:51 |只看该作者
我看了你2个帖子,你为什么总要走极端找麻烦?

语言本身没规定你这个用法,你非要这样写,如此而来的问题是无穷不尽的。

论坛徽章:
0
8 [报告]
发表于 2012-04-20 16:08 |只看该作者
zuiwei 发表于 2012-04-20 10:10
我在VC2010下面写了几行程序(release版):我期待的打印结果是223344
但是实际的结果是:
22202448236512451 ...



珍惜生命,远离流操作。

见过太多的人死在<<符号上了。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
9 [报告]
发表于 2012-04-20 16:45 |只看该作者
回复 7# walleeee

现在悬赏被采纳不会增加专家积分,已经确认了……
以前积分具体是多少没注意,于是被采纳了也忘记之前是多少了…… 没能确认这个事…… 之前只是隐约感觉不对……  涨得也太慢了点吧……
昨天你提到这个事后,我就注意了一下。243,这个帖子采纳前后都是这个分数。

论坛徽章:
0
10 [报告]
发表于 2012-04-20 17:08 |只看该作者
回复 9# OwnWaterloo


无所谓啊 又不是csdn
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP