在C中初始化字符串;下面的有用吗?

Inf*_*ter 3 c string initialization

我知道如何用两种不同的方式初始化 C 中的字符串。

char str[] = "abcd";

char str[] = {'a','b','c','d','\0' };
Run Code Online (Sandbox Code Playgroud)

清晰地书写"abcd"而不是{'a','b','c','d','\0' }节省时间且舒适。

是否有任何特殊原因可以让我们像最后一行那样初始化字符串?它在某些情况下有用还是多余?

Lun*_*din 5

一般来说,不,没有区别。除了一些高级例外情况,如下......

  • 在某些情况下,您需要一个不是有效 C 字符串的字符数组 - 即不是以 null 结尾的。那么就必须使用后一种形式。不过,只有一些非常特殊的情况需要这样的字符串:非常古老的 Unix 代码和某些嵌入式系统实现。

  • 后一种形式的另一个优点是更好的转义序列。字符串文字的转义序列有点损坏。假设我希望打印一个扩展符号,代码为 0xAA,然后是字符串“ABBA”。puts("\xAAABBA");不会编译,因为它采用\x十六进制后面的所有内容。char str[] = {'\xAA','A','B','B','A','\0'}; puts(str);不过效果很好。(但是,您也可以将字符串文字拆分为几个,以实现相同的效果:"\xAA" "ABBA"。)

  • 使用字符串文字进行初始化也存在此处讨论的微妙但严重的 C 语言缺陷:
    Inconsensus gccdiagnostic for string初始化