标题:恶心的sizeof
只看楼主
liangyua
Rank: 1
来 自:大连理工大学
等 级:新手上路
帖 子:11
专家分:0
注 册:2013-8-10
结帖率:60%
已结贴  问题点数:10 回复次数:16 
恶心的sizeof
这个问题纠结了好久,是上c语言课老师留下的思考题,结果好说但是不明白为什么求高手指教一下我这个小白
int *p=NULL;
sizeof(p)的值是多少?
sizeof(*p)的值是多少?
int a[100];
求:
sizeof(a)
sizeof(a[100])
sizeof(&a);
sizeof(&a[0])
搜索更多相关主题的帖子: 思考题 c语言 
2013-08-10 11:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:2 
这有啥好纠结的,每一种类型都有固定长度
p的类型是 int*,那么sizeof(p)就是int*这种类型所占的长度,它是个普通指针,在32bits平台上就是4bytes,在64bits平台上就是8bytes
*p的类型是int,那么sizeof(*p)就是int这种类型所占的长度,不同的数据模型下有不同的长度,比如ILP32/LLP64/LP64下是4字节,ILP64下是8字节
a的类型是int[100],所以长度就是 100*sizeof(int),int的长度上面说过了
a[100]的类型是int,int的长度上面说过了
&a 和 &a[0] 都是普通指针,普通指针的长度上面说过了
2013-08-10 12:05
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
得分:2 
顶版主

否极泰来
2013-08-10 14:02
liangyua
Rank: 1
来 自:大连理工大学
等 级:新手上路
帖 子:11
专家分:0
注 册:2013-8-10
得分:0 
有道理是有道理 但是sizeof(&a)=400啊
2013-08-10 14:39
蚕头燕尾
Rank: 10Rank: 10Rank: 10
来 自:Gryffindo
等 级:贵宾
威 望:12
帖 子:734
专家分:1546
注 册:2013-3-24
得分:2 
回复 4楼 liangyua
亲测:

除了sizeof(a)==400之外

都是等于4的。

楼主应该是不知道哪里写错了。

学习编程,为的是表达自己的思想,而不是被别人的思想所禁锢。要先明白自己想干嘛,而不要先问别人让你干嘛。               

                                                                                                                    Black Cat      Hello Tomorrow~
2013-08-10 14:47
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
以下是引用liangyua在2013-8-10 14:39:08的发言:

有道理是有道理 但是sizeof(&a)=400啊

怎么可能呐,&a 的类型是 int (*)[100],是个数组的指针
程序代码:
#include <stdio.h>

int main()
{
    int a[100];
    printf( "%u\n", (unsigned)sizeof(&a) ); // 按C99标准,应当是 printf( "%zu\n", sizeof(&a) ); 但目前还没几个编译器支持%z

    return 0;
}
在 VC9.0 中,按C方式编译,按C++方式编译,都输出4
在 gcc4.8.1 中,按C方式编译,按C++方式编译,都输出4
你用的是什么编译器呀?如果输出400,你这个编译器肯定有bug呀






[ 本帖最后由 rjsp 于 2013-8-10 16:22 编辑 ]
2013-08-10 16:20
XiaoXiao_Ren
Rank: 3Rank: 3
来 自:西安
等 级:论坛游侠
威 望:1
帖 子:80
专家分:198
注 册:2013-7-17
得分:0 
回复 4楼 liangyua
有道理是有道理 但是sizeof(&a)=400啊


是不是写错了  是sizeof(a)=400吧!!!!

否极泰来
2013-08-10 16:36
Rynax
Rank: 1
等 级:新手上路
帖 子:10
专家分:8
注 册:2013-8-8
得分:2 
刚刚用ubuntu试了下,64位ubuntu,gcc编译,&a的确是8(相当于地址)。
不过你们确定&a这种用法没错吗?
如果是int i,i指的是一个int的内容,那么&i指的是取这个内容的地址,这个内容是存在实实在在的内存里的,所以地址也是实实在在的。
a本身就是数组地址了,再对地址去取地址有意义吗?就相当于对我家门牌号取门牌号。。。
打印结果是a和&a是相同的(地址用%p吧?)
因为之前的程序我随手将&a转成了2级指针,结果就出了个恶心的bug。。。
2013-08-10 20:50
Rynax
Rank: 1
等 级:新手上路
帖 子:10
专家分:8
注 册:2013-8-8
得分:0 
另外一点,%zu是size_t类型吧,刚刚gcc给我报的是long unsigned int,所以我用的%lu,然后顺利过了,是我用64位系统的原因吧?
2013-08-10 20:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:2 
明显是未定义行为,玩代码的就会这样写。sizeof(&a),你期望它是什么结果?如果自己都不知道,就不要写。

授人以渔,不授人以鱼。
2013-08-10 21:04



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-418881-1-1.html




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

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