为什么sizeof(*"327")在64位系统上返回1而不是8?

lor*_*ith 22 c sizeof

 printf("%lu \n", sizeof(*"327"));
Run Code Online (Sandbox Code Playgroud)

我一直认为指针的大小在64位系统上是8个字节但是这个调用一直在返回1.有人可以提供解释吗?

hac*_*cks 61

放在*字符串文字之前将取消引用文字(因为字符串文字是字符数组,并将衰减到指向其在此上下文中的第一个元素).该声明

printf("%zu \n", sizeof(*"327")); 
Run Code Online (Sandbox Code Playgroud)

相当于

printf("%zu \n", sizeof("327"[0]));  
Run Code Online (Sandbox Code Playgroud)

"327"[0]将给出字符串文字的第一个元素"327",即字符'3'."327"腐烂之后的类型,在char *解除引用之后,它将给出一个类型的值,char最终sizeof(char)1.

  • @dwilliss; 在C中,"3"是一个整数常量.根据C标准,整数字符常量的类型为"int". (10认同)
  • @Wilson你误会了.所有字符常量在C中一直都是`int`类型.只有在C++中才是``char`类型的''3'(或`'m'`).不相信吗?`int main(){printf("%zu \n",sizeof'm');}` (6认同)
  • 它并没有真正取消引用"3"(即字符文字).它将字符串文字(`char*`)解除引用到第一个元素,它将是一个`char`,因此是一个字节(`*(char*)=(char)`).恰好,取消引用的字符串文字的值是`(char)'3',因为这是字符串中的第一个字符. (6认同)
  • @dwilliss [它一直是C中的`int`](/sf/ask/152106041/) (5认同)
  • @dwilliss`sizeof('3')`一直与`sizeof(int)`相同.同样,`sizeof(*"3")`始终与`sizeof(char)`相同.听起来不合逻辑,字符文字不是`char`类型.实际上,*C中的所有*文字至少都是`int`的大小.要获得类型为`char`的东西,你需要一个带有除文字之外的东西的表达式. (5认同)
  • @Wilson; 不."3"与"m"的类型相同:两者都是字符常量.但我不知道为什么标准使用"整数字符常量".*"整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值."* - C11:6.4.4.4(P10). (3认同)
  • @MarkReed复合文字`(char){'3'}`的大小为1 (2认同)

Mar*_*evi 18

该声明:

printf("%lu \n", sizeof(*"327"));
Run Code Online (Sandbox Code Playgroud)

实际打印a的大小char,因为使用*解引用字符串的第一个字符327.将其更改为:

char* str = "327";
printf("%zu \n", sizeof(str));
Run Code Online (Sandbox Code Playgroud)

请注意,我们需要在%zu这里使用,而不是%lu因为我们正在打印一个size_t.