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
[解决办法]
[解决办法]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自身的大小。
[解决办法][解决办法][解决办法]有可能。 sizeof就不该有运行时的计算,明显的编译器问题。
[解决办法]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)等价起来了
[解决办法]楼主严谨治学的精神值得表扬
[解决办法]编译器不一样,主要是看你的编译器是怎么处理的
[解决办法]