随笔 - 113  文章 - 0  评论 - 218  阅读 - 73万

发现C++的sizeof关键字的奇怪问题

在调试程序的时候发一个关于关键字sizeof的令我感到困惑的问题

看下面的例子:

int a[5]

所有人都明白这里定义了一个数组,其包含了5 个int 型的数据。我们可以用a[0],a[1]等来访问数组里面的每一个元素。

当我们定义一个数组a 时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a。名字a 一旦
与这块内存匹配就不能被改变。a[0],a[1]等为a 的元素,但并非元素的名字。数组的每一个元素都是没有名字的。那现在再来看看sizeof 关键字时的几个问题:
sizeof(a)的值为sizeof(int)*5,32 位系统下为20。
sizeof(a[0])的值为sizeof(int),32 位系统下为4。
sizeof(a[5])的值在32 位系统下为4,此处并不会出错。关键字sizeof 求值是在编译的时候。虽然并不存在a[5]这个元素,但是这里也并没有去真正访问a[5],而是仅仅根据数组元素的类型来确定其值。所以这里使用a[5]并不会出错。

sizeof(a)取5个元素的大小,在32位系统下为20,这个好理解,所有元素的sizeof值

sizeof(&a[0])的值在32位系统下是4,这个也好理解,首元素a[0]的首地址.

但是sizeof(&a) 在32位系统下VC++6.0的结果为20,这个令我非常难以理解,&a不是数组a的首地址么?&a既然是取a 的首址那不是应该为4才对吗?如果我的观点是正确的,那么是不是编译器出错了?如果我的观点的是错误的,那么&a就不是取首地址了?非常矛盾!

希望高人指点。

posted on   陈国利  阅读(653)  评论(10编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
< 2010年11月 >
31 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 1 2 3 4
5 6 7 8 9 10 11

点击右上角即可分享
微信分享提示