我在哪里错这个推理?

时间:2018-07-18 07:57:30

标签: c pointers dereference

考虑在C中定义一个char指针。然后执行指令:

char *str
str = "Hello World!"

没有产生任何错误。假设我对C和指针的知识几乎是不可接受的,为什么该指令正确?不应该是:

str = &("Hello World!");

2 个答案:

答案 0 :(得分:3)

引用C11,第6.3.2.1章

  

除非它是sizeof运算符,_Alignof运算符或   一元&运算符,或者是用于初始化数组的字符串文字,该表达式具有   类型“类型数组” 转换为类型为“类型指针” 的表达式   数组对象的初始元素,不是左值。 [....]

此处,字符串文字(基本上是char FootNote 的类型数组)在用作赋值运算符的RHS时,会衰减到指向第一个元素的指针数组。

因此,根据赋值运算符的要求,LHS(指针类型)和RHS(派生指针类型)是兼容的,并且该语句有效。

那是

 str = &("Hello World!");

无效,因为&("Hello World!");的类型为char (*) [13](指向由13个char组成的数组的指针),并且不是char *的兼容类型,作业的LHS。


脚注:

引用C11,第6.4.5节

  

在翻译阶段7中,每个多字节附加一个字节或零值的代码   由字符串文字或文字产生的字符序列。78)多字节字符   然后使用序列来初始化静态存储持续时间和长度的数组   足以包含序列。对于字符串文字,数组元素具有   类型为char,并使用多字节字符的各个字节进行初始化   顺序。 [....]

答案 1 :(得分:3)

字符串文字"Hello World!"是类型char [13]的匿名对象,即13个字符的数组,它隐式衰减为指向数组第一个字符的指针(char *!)。在所有情况下,除非数组作为&的操作数或在sizeof / _Alignof中出现。

str = &("Hello World!")

(可以在没有括号str = &"Hello World!"的情况下写)特别是 不正确,因为&("Hello World!")的结果是*char (*)[13]类型的,即指针最多包含13个字符!

海湾合作委员会将其诊断为

test.c:3:9: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     str = &"Hello World!";