【问题标题】:Are string literals automatically being casted to char* at compile time in C?字符串文字是否在 C 编译时自动转换为 char*?
【发布时间】:2013-10-17 03:23:34
【问题描述】:

如果我要这样做:

printf("The string is: %s\n", "string1");

以下是在编译时完成的:

printf("The string is: %s\n", (unsigned char*) "string1"); 

还是类似的?

【问题讨论】:

    标签: c string pointers types compilation


    【解决方案1】:

    标准定义字符串字面量的类型是char1的数组,数组自动衰减为指针,即char*。当使用 %s 说明符时,您不需要在将其作为参数传递给 printf 时显式地强制转换它。

    旁注:在 C++ 中,它是 const char*2


    [1] C99 6.4.5: “字符串文字是包含在 双引号,如“xyz”... 静态存储持续时间和长度的数组 足以包含序列。对于字符串文字,数组元素有 输入char"

    [2] C++03 2.13.4 §1: "一个普通的字符串字面量具有类型“n 的数组” const char”和静态存储时长”

    【讨论】:

    • 我明白了。这只是我知道必须发生的事情,但很好奇它是如何实现的; typedef 是有意义的。
    • 我看到你要添加一个来自 C 标准的引用,但它不是 C 下的 const char *
    • 抱歉,我太挑剔了,但字符串文字本身的类型是“char 的数组”,在 C11 6.7.9.32 下最明确,但在 C11 6.4.5.6 下也是如此。显然你是正确的,在通常情况下它会衰减到char *。参考 +1。
    • @PaulGriffiths:无需道歉。现在检查我的答案,它应该是完美的:)
    【解决方案2】:

    您的理解或多或少是正确的,尽管机制不同。

    除非它是sizeof 或一元& 运算符的操作数,或者是用于在声明中初始化另一个数组的字符串文字,否则为“T 的N 元素数组”类型的表达式将被转换(“decay”)为类型为“pointer to T”的表达式,表达式的值将是数组中第一个元素的地址。这适用于所有数组类型,而不仅仅是字符串文字。

    表达式"string1"的类型为“char的8元素数组”1;在printf 调用中,它不是sizeof 或一元& 运算符的操作数,也不是用于初始化另一个数组,因此它被隐式转换为“指向char 的指针”类型的表达式2,其值为第一个字符的地址。


    1。 7 个字母加上 0 终止符。
    2.在 C 中就是这种情况;在 C++ 中,字符串文字是 const char 的数组,因此表达式将衰减为类型 const char *

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-02
      • 2011-10-06
      • 2018-03-27
      • 2013-05-13
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多