| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1483 人关注过本帖
标题:请问大佬们这个sizeof怎么输出8啊怎么算的?
只看楼主 加入收藏
Gloria_zhang
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2020-10-29
结帖率:71.43%
收藏
已结贴  问题点数:5 回复次数:6 
请问大佬们这个sizeof怎么输出8啊怎么算的?
图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 输出 sizeof 
2020-12-14 15:20
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
不要贴图,贴图是不道德的

s[0] 的类型是 char[10]
s[0]+1 的类型是 char*
所以 sizeof(s[0]+1) 等同于 sizeof(char*)
但为什么 sizeof(char*) 是 8,那是实现定义。

另外,sizeof 的类型是 size_t,不是 int
所以应该写成 size_t t = sizeof(s[0]+1); printf("%zu\n", t);
2020-12-14 15:30
Gloria_zhang
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2020-10-29
收藏
得分:0 
回复 2楼 rjsp
什么叫实现定义,我是小白,这个难道不是因为s[0]+1是个地址吗,然后地址占8B?
2020-12-14 15:35
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
回复 3楼 Gloria_zhang
"实现定义" 就比如 地址占多少bytes,有2bytes,有4bytes,有8bytes,……。
C标准没法规定,只能交由编译器自己去决定,编译器根据target环境决定地址占几bytes。

你编译运行的结果是 8,但不等于你换个编译参数后依然是 8,也不等于其它编译器输出的就是 8.
这就是“实现定义”
2020-12-14 15:44
Gloria_zhang
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2020-10-29
收藏
得分:0 
回复 4楼 rjsp
程序代码:
int main()
{
  int * p;
  
  printf("%d ",sizeof(p));
  printf("%d ",sizeof(*p)); 
  
  return 0;
}

 


在问下您这个怎么输出8和4呢?
2020-12-14 15:50
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:5 
回复 5楼 Gloria_zhang
这只说明你这个编译器在你目前的编译参数下,将 int 定为 4bytes,将 int* 定为 8bytes。
没有为什么?你换个编译器,或换个编译参数,它们说不定就变了。

在C标准之外,大部分编译器为了互相之间通用,约定了一些数据模型。常用的有下面5个
TYPE          LP32     ILP32   LLP64   LP64    ILP64
char           8        8       8       8       8
short         16       16      16      16      16
int           16       32      32      32      64
long          32       32      32      64      64
long long     64       64      64      64      64
pointer       32       32      64      64      64

在x64中,gcc/clang默认使用LP64,而vc默认使用LLP64。
当然了,不是所有编译器都使用上述5个数据模型之一。

再提醒一下, printf("%d ",sizeof(p)) 等应该是  printf("%zu ",sizeof(p));
2020-12-14 16:42
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
表格没法不对齐,我试试换成 中文全角空格

程序代码:
TYPE     LP32  ILP32  LLP64  LP64  ILP64
char      8    8    8    8    8
short     16   16    16   16   16
int      16   32    32   32   64
long     32   32    32   64   64
long  long  64   64    64   64   64
pointer    32   32    64   64   64
2020-12-14 16:48
快速回复:请问大佬们这个sizeof怎么输出8啊怎么算的?
数据加载中...
 
   



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

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