char *str = "String!";
Run Code Online (Sandbox Code Playgroud)
char *str = (char []){"String!"};
Run Code Online (Sandbox Code Playgroud)
这两个初始化等效吗?如果不是,它们之间有什么区别?
这两个初始化等效吗?
不。
如果不是,它们之间有什么区别?
两者之间的主要区别之一是您无法修改str第一个代码片段中指向的对象,而在第二个代码片段中则可以。
尝试修改 C 中的字符串文字是未定义的行为。所以如果是
char *str = "String!";
Run Code Online (Sandbox Code Playgroud)
如果您尝试修改 指向的对象str,它将调用 UB。
的情况下
char *str = (char []){"String!"};
Run Code Online (Sandbox Code Playgroud)
但是,(char[]){"String!"}是一个复合文字,其类型为s数组char,并str指向该数组的第一个元素。
由于复合文字不是只读的(没有限定符const),因此您可以修改 指向的对象str。
"String!"您应该注意的另一个区别是,第一个中的字符串文字具有静态存储持续时间,而(char []){"String!"}第二个中的复合文字仅当它出现在函数体之外时才具有静态存储持续时间;否则,它具有与封闭块关联的自动存储持续时间。
从 n1570 6.5.2.5(复合文字)p12 开始:
12 示例5 以下三个表达式具有不同的含义:
Run Code Online (Sandbox Code Playgroud)"/tmp/fileXXXXXX" (char []){"/tmp/fileXXXXXX"} (const char []){"/tmp/fileXXXXXX"}第一个始终具有静态存储持续时间并具有 char 类型数组,但不需要可修改;当后两个出现在函数体内时,它们具有自动存储持续时间,并且这两个中的第一个是可修改的。