printf("%lu n", sizeof(*"327"));
我一直认为指针的大小在64位系统上是8个字节,但是这个调用一直在返回1.有人可以提供解释吗?
在字符串文字之前放置*
将取消引用文字(因为字符串文字是字符数组,并将衰减到指向其在此上下文中的第一个元素)。 该声明
printf("%zu n", sizeof(*"327"));
相当于
printf("%zu n", sizeof("327"[0]));
"327"[0]
将给出字符串文字"327"
的第一个元素,即字符'3'
。 在衰减之后, "327"
类型是char *
并且在解除引用后它将给出char
类型的值,并且最终sizeof(char)
是1
。
该声明:
printf("%lu n", sizeof(*"327"));
实际上打印一个char
的大小,因为使用*
取消引用字符串327
的第一个字符。 将其更改为:
char* str = "327"; printf("%zu n", sizeof(str));
请注意,我们需要在这里使用%zu
而不是%lu
,因为我们正在打印size_t
值 。
字符串文字是一个匿名的静态字符数组,它会衰减到指向其第一个字符的指针 – 即char *
类型的指针值。
结果像*"abc"
这样的表达式相当于*someArrayOfCharName
,后者相当于*&firstCharInArray
,它产生firstCharInArray
。 而sizeof(firstCharInArray)
是sizeof(char)
,它是1
。
哈克的好答案。
此外,您的代码的行为是未定义的 ,因为您使用了错误的格式说明符。
因此,使用%zu
而不是%lu
因为sizeof()
返回size_t
而size_t
是unsigned
。
C11标准:§7.21.6.1:第9段:
如果转换规范无效,则行为未定义.225)如果任何参数不是相应转换规范的正确类型,则行为未定义。
需要了解更多c/c++开发分享为什么sizeof(*“327”)在64位系统上返回1而不是8?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享为什么sizeof(*“327”)在64位系统上返回1而不是8?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980015.html