为什么sizeof(*“327”)在64位系统上返回1而不是8?
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)如果任何参数不是相应转换规范的正确类型,则行为未定义。