char a[10];sizeof(a)=10;为什么sizeof(&a)=10;?为什么不是4

炼气士 2011-07-20 08:56:05
sizeof(a)等于10,我能理解,计算的是数组a所占空间的大小,即10个字节,
但之前看比人说a可以当做指针,那么&a取的就是数组a的地址,应该是a[0]所占的地址吧(?是吗),如果&a是
指针,那么如果是32位的话,那么sizeof(&a)不就是求指针的长度,不应该是4吗?
...全文
1478 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jernymy 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 supermegaboy 的回复:]
没有冲突,最终类型是根据表达式推断出来的,对于sizeof( &a ),并没有计算&a的结果(即没有计算a的地址),但由于a的类型是int[10],因此从&a可以推断出结果的类型是int(*)[10]。
[/Quote]

支持这个,sizeof的使用还是挺有意思的
飞天御剑流 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 ljd680 的回复:]
引用 8 楼 supermegaboy 的回复:

引用 5 楼 xingzhiyaoni321 的回复:
在VC上是10 ,但是
在linux上跑出来的是4啊 !
标准不一样,


不是标准不一样,标准只有一本。VC在这个问题上的行为是错误的,如果是VC6,赶快把它扔掉,VC6有大量不符合标准的行为,歧途一条。


你的博客看了,还没看完,暂时也没看懂,但我用VS2005调……
[/Quote]

是的,结果不对。
机智的呆呆 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 supermegaboy 的回复:]
没有冲突,最终类型是根据表达式推断出来的,对于sizeof( &a ),并没有计算&a的结果(即没有计算a的地址),但由于a的类型是int[10],因此从&a可以推断出结果的类型是int(*)[10]。
[/Quote]
恩,我明白了,多谢。
飞天御剑流 2011-07-20
  • 打赏
  • 举报
回复
没有冲突,最终类型是根据表达式推断出来的,对于sizeof( &a ),并没有计算&a的结果(即没有计算a的地址),但由于a的类型是int[10],因此从&a可以推断出结果的类型是int(*)[10]。
机智的呆呆 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermegaboy 的回复:]
引用 5 楼 xingzhiyaoni321 的回复:
在VC上是10 ,但是
在linux上跑出来的是4啊 !
标准不一样,


不是标准不一样,标准只有一本。VC在这个问题上的行为是错误的,如果是VC6,赶快把它扔掉,VC6有大量不符合标准的行为,歧途一条。
[/Quote]
The size is determined from the type of the operand. The result is an integer. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant.
c99说,除了可变数组类型(variable length array type),其他的情况操作数不会被求值的。
而&a中运算符&需要求值一次,才返回int (*)[10],不是和上面规定冲突了吗?
求解释。
炼气士 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 supermegaboy 的回复:]

引用 5 楼 xingzhiyaoni321 的回复:
在VC上是10 ,但是
在linux上跑出来的是4啊 !
标准不一样,


不是标准不一样,标准只有一本。VC在这个问题上的行为是错误的,如果是VC6,赶快把它扔掉,VC6有大量不符合标准的行为,歧途一条。
[/Quote]

你的博客看了,还没看完,暂时也没看懂,但我用VS2005调试也是这个结果,sizeof(&a)=10;难道VS也有这个毛病吗?
飞天御剑流 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xingzhiyaoni321 的回复:]
在VC上是10 ,但是
在linux上跑出来的是4啊 !
标准不一样,
[/Quote]

不是标准不一样,标准只有一本。VC在这个问题上的行为是错误的,如果是VC6,赶快把它扔掉,VC6有大量不符合标准的行为,歧途一条。
机智的呆呆 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 supermegaboy 的回复:]
http://blog.csdn.net/supermegaboy/article/details/4855027

http://blog.csdn.net/supermegaboy/article/details/4855010
[/Quote]
收藏,学习。
vanguards 2011-07-20
  • 打赏
  • 举报
回复
表达式的含义还是求字节数数组名a就是a【0】的地址
xingzhiyaoni321 2011-07-20
  • 打赏
  • 举报
回复
在VC上是10 ,但是
在linux上跑出来的是4啊 !
标准不一样,
飞天御剑流 2011-07-20
  • 打赏
  • 举报
回复
[Quote=引用楼主 ljd680 的回复:]
sizeof(a)等于10,我能理解,计算的是数组a所占空间的大小,即10个字节,
但之前看比人说a可以当做指针,那么&a取的就是数组a的地址,应该是a[0]所占的地址吧(?是吗),如果&a是
指针,那么如果是32位的话,那么sizeof(&a)不就是求指针的长度,不应该是4吗?
[/Quote]

你用哪个编译器sizeof( &a )的结果是10,是不正确的,不符合标准,&a的结果是一个指针,因此结果应该是sizeof( int(*)[10] );
lijianzhao2010 2011-07-20
  • 打赏
  • 举报
回复
a本身就是a【0】的地址了吧
机智的呆呆 2011-07-20
  • 打赏
  • 举报
回复
sizeof 后面的表达式不会被求值的。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧