首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

int a[100];有关于sizeof(&a)值的一个有关问题

2012-10-14 
int a[100]有关于sizeof(&a)值的一个问题int a[100]printf(“%d,%d,%d,%d\n”,sizeof(a),sizeof(&a),sizeo

int a[100];有关于sizeof(&a)值的一个问题
int a[100];

printf(“%d,%d,%d,%d\n”,sizeof(a),sizeof(&a),sizeof(a[0]),sizeof(&a[0]);

在VC6.0下运行,上面的结果是400,400,4,4。sizeof(a),sizeof(a[0]),sizeof(&a[0])我都明白是怎么一回事,这里只是拿出来做一个对比,让我不明白的就是为什么sizeof(&a)也是400,&a是整个数组的地址,它难道不应该是一个整型值,大小为4吗?


[解决办法]
我在Linux平台给你运行了一次 结果是 400 4 4 4
[解决办法]

探讨

我在Linux平台给你运行了一次 结果是 400 4 4 4

[解决办法]
VC6下会有类似:
12: int c = sizeof(&a);
00401079 mov dword ptr [ebp-194h],190h
13:
14: int d = sizeof(a);
00401083 mov dword ptr [ebp-198h],190h
所以sizeof(&a)==sizeof(a);
-------------------
其他编译器可能会把&a当做一个地址,32位机器下那就是4字节
[解决办法]
a在作为&和sizeof的操作数时数组类型的左值,不退化为指针类型的值。因此&a得到指向数组a的指针,sizeof(a)是数组a自身的大小。
[解决办法]
探讨

VC6下会有类似:
12: int c = sizeof(&a);
00401079 mov dword ptr [ebp-194h],190h
13:
14: int d = sizeof(a);
00401083 mov dword ptr [ebp-198h],190h
所以sizeof(&a)==……

[解决办法]
探讨

引用:

VC6下会有类似:
12: int c = sizeof(&a);
00401079 mov dword ptr [ebp-194h],190h
13:
14: int d = sizeof(a);
00401083 mov dword ptr [ebp-198h],190h……

[解决办法]
有可能。 sizeof就不该有运行时的计算,明显的编译器问题。

探讨
VC6下会有类似:
12: int c = sizeof(&a);
00401079 mov dword ptr [ebp-194h],190h
13:
14: int d = sizeof(a);
00401083 mov dword ptr [ebp-198h],190h
所以sizeof(&a)==sizeof(a);
-------------------
……

[解决办法]
VC6错是情有可原的.那个时候标准都还没有呢.
而且数组取地址,从数值上来说&a==a.VC6在标准不明确的情况下.很容易得出这种结果
[解决办法]
VC6在这一点不正确,但C89已经有了,是未按标准

数组名a在大多数情况下的语义是&a[0],只有两个例外,即sizeof(a)和&a---这里代表整个数组

double a[100]={0};

printf(“%d,%d,%d,%d\n”,sizeof(a),sizeof(&a),sizeof(a[0]),sizeof(&a[0]);


printf(“%x,%x,%x,%x\n”,a,&a,a[0],&a[0];

指针长度和int长度相同,绕开
输出它们的值----数值与地址分开
[解决办法]
在VC6.0中得到的结果和在linux平台中得到的结果,果然不一样啊……
[解决办法]
这是vc6.0的bug。。


vs后续版本结果就正常了

楼主不要再纠结了
[解决办法]
也不能说是bug吧,就是vc60把sizeof(a)和sizeof(&a)等价起来了
[解决办法]
楼主严谨治学的精神值得表扬
[解决办法]
编译器不一样,主要是看你的编译器是怎么处理的
[解决办法]
探讨

VC6错是情有可原的.那个时候标准都还没有呢.
而且数组取地址,从数值上来说&a==a.VC6在标准不明确的情况下.很容易得出这种结果

热点排行