c/c++语言开发共享为什么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)如果任何参数不是相应转换规范的正确类型,则行为未定义。

    需要了解更多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

      (0)
      上一篇 2021年12月13日
      下一篇 2021年12月13日

      精彩推荐