| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 726 人关注过本帖
标题:对VC编译器空间分配的一点疑惑
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:4 
对VC编译器空间分配的一点疑惑
#include "stdio.h"

int main()
{
 short array1[0x100];
 short array2[0x100];

 printf("The actual spaces of iarray1 is %x (array1-array2)\n",array1-array2);
    printf("The declare spaces of iarray1 is %x (sizeof(array1))\n",sizeof(array1));
 return 0;
}

在VC6平台下,上面运行的显示结果是

The actual spaces of iarray1 is 100 (array1-array2)

The declare spaces of iarray1 is 200 (sizeof(array1))

而在VS2005平台下,上面运行的显示结果是  

The actual spaces of iarray1 is 104 (array1-array2)

The declare spaces of iarray1 is 200 (sizeof(array1))

也就是不管在 VC6平台下,还是在VS2005平台下,对于short array1[0x100];分配的实际空间大小(array1-array2)和期望的大小(sizeof(array1) 是不一致的,不知道这个算不算一个BUG ??还是C标准中本来就该这样解释

我本来感觉 (array1-array2)和 (sizeof(array1))这两个值应该是相等的!

int.JPG (35.89 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 编译平台 空间分配 
2008-11-14 16:41
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
两个指针相减你想得到的是什么?

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2008-11-14 16:44
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 2# 的帖子
局部变量放在堆栈中
他们的地址是连续的
因此相减得到的是前一个变量占据堆栈的空间大小

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-14 19:49
debroa723
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:23
帖 子:862
专家分:1954
注 册:2008-10-12
收藏
得分:0 
在VC6平台下,上面运行的显示结果是
The actual spaces of iarray1 is 100 (array1-array2)
The declare spaces of iarray1 is 200 (sizeof(array1))

这时的结果其实没有错误,array1-array2好象是得到的是两地址之间的差,其实它是指针运算,它的结果是以数组的数据类型为基本单位的减法运算,所以它得到的是数组的元素个数.相信这样说你应该明白了,指针的加减运算是根据数据类型来的,就算是用double类型或是用自定义的类\结构,它的加减运算也是用类型的长度来做基本单位的,这一点和编译器无关.
而sizeof(array1)则是得到的字节的个数,有几个八位,很显示,它和上面的结果有倍数关系(当然也有例外).


而在VS2005平台下,上面运行的显示结果是  
The actual spaces of iarray1 is 104 (array1-array2)
The declare spaces of iarray1 is 200 (sizeof(array1))
至于这里,为什么array1-array2结果是104,我调试了一下,发现两个变量在内存结构上有点不一样,就是在最后多出了八个字节,也就是两个int四个short,至于为什么这样并不清楚,可能这才是因为编译器的差异吧,后来我想可能和64位有关,用512/64的余得8,所以这个是可能的原因是为了补满为64的倍数吧,那么我如此证明,让数组元素的个数满足64的倍数,按该理论,在两个数组之间就不会有多余的空间出现,但调试证明,两个数组之间还是会有八个字节,不光数组,任何两个声明的变量之间,都有这八个字节存在,谁知道为什么?
2008-11-14 20:35
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
有人说标准C中对局部变量的地址没有做任何规定
只是要求他们放在堆栈中就可以了

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2008-11-14 23:33
快速回复:对VC编译器空间分配的一点疑惑
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018481 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved