字符串文字

字符串文字表示 char 的以 null 结尾的静态持续时间数组。因为它们具有静态存储持续时间,所以可以安全地以指向自动数组的指针的多种方式使用字符串文字或指向相同底层数组的指针。例如,从函数返回字符串文字具有明确定义的行为:

const char *get_hello() {
    return "Hello, World!";  /* safe */
}

由于历史原因,对应于字符串文字的数组元素不是正式的 const。然而,任何修改它们的尝试都有不确定的行为 。通常,尝试修改与字符串文字对应的数组的程序将崩溃或以其他方式发生故障。

char *foo = "hello";
foo[0] = 'y';  /* Undefined behavior - BAD! */

如果一个指针指向一个字符串文字 - 或者它有时可能会这样做 - 建议指出该指针的指示符,以避免意外地处理这种未定义的行为。

const char *foo = "hello";
/* GOOD: can't modify the string pointed to by foo */

另一方面,指向或进入字符串文字的底层数组的指针本身并不特殊; 它的值可以自由修改以指向其他内容:

char *foo = "hello";
foo = "World!"; /* OK - we're just changing what foo points to */

此外,虽然 char 数组的初始化程序可以与字符串文字具有相同的形式,但使用这样的初始化程序并不会赋予初始化数组上字符串文字的特征。初始化程序只是指定数组的长度和初始内容。特别是,如果没有明确声明 const,元素是可修改的:

char foo[] = "hello";
foo[0] = 'y';  /* OK! */