为什么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_tsize_tunsigned

C11标准:§7.21.6.1:第9段:

如果转换规范无效,则行为未定义.225)如果任何参数不是相应转换规范的正确类型,则行为未定义。