C 中没有空终止符的字符数组

use*_*248 1 c arrays string null-terminated undefined-behavior

有时我使用字符(字符串)序列,但不需要或不需要空终止符,例如,如果我正在使用memcpy()并且长度已知。这样,我更喜欢省略空终止符。一个麻烦的方法是声明一个数组:

char no_term[5] = {'h', 'e', 'l', 'l', 'o'};
Run Code Online (Sandbox Code Playgroud)

但是,我更喜欢使用带引号的字符串,因为使用它们进行编程效率更高。但是,带引号的字符串末尾会自动包含一个空终止符。但是指定数组大小以排除空终止符会引发未定义的行为吗?只要我不在需要空终止字符串的地方使用它们(例如,将它们传递给) ,以下C 是否有效?strlen()

char no_term[5] = "hello";
char no_term_array[3][3] = {"foo", "bar", "baz"};
Run Code Online (Sandbox Code Playgroud)

And*_*zel 6

根据ISO C11 标准的 \xc2\xa76.7.9 \xc2\xb614,字符类型的数组可以从字符串文字初始化,即使没有空间用于终止空字符。

\n

所以是的,您发布的代码是有效的,不会调用未定义的行为。

\n

但请注意,这仅在 C 中合法,在 C++ 中不合法。在 C++ 中,必须有空间用于终止空字符。

\n

  • 但结果变量不是 C 字符串,因为它没有 NUL 终止符。它只是一个数组,将它当作字符串来“处理”是一种未定义的行为。 (2认同)
  • @WeatherVane这就是为什么我在标题中说“字符数组”而不是“字符串” (2认同)
  • @WeatherVane 这个问题特别要求一个不会像空终止字符串一样处理的数组 (2认同)