以下问题:我想用字符串文字初始化一个字符数组,如下所示:
char test[6] = "hello";
字符串"你好"终止0需要5个字符+ 1,所以6的数组就足够了。当我尝试这样做时:
char test[4] = "hello";
我收到这样的编译器警告:
警告:字符数组的初始化字符串太长[默认情况下启用]
但是当我尝试这个时:
char test[5] = "hello";
不会发出任何警告。很明显,在这种情况下,编译器不会对字符串使用终止0
,这会在我的代码中导致意外行为。是否有可能在编译器中激活警告?或者是否有一些预处理程序断言可以找到这样的问题?
我知道的唯一方法是不使用字符串文字进行初始化,而是使用普通的数组初始化:
char test[5] = {'h', 'e', 'l', 'l', 'o', '\0'};
这将导致以下警告:
警告:数组初始值设定项中的多余元素[默认启用]
PS:我知道我可以在我的例子中省略数组的长度,如下所示:
char test[] = "hello";
但是在实际代码中,这不是一个选项,因为最大字符串长度是一个全局常量:
#define MAX_STRING_LEN
char string[MAX_STRING_LEN + 1] = "default_string";
我知道MAX_STRING_LEN
的值我可以手动检查默认字符串是否不长于MAX_STRING_LEN
,但这很容易出错,如果我或代码的某个用户是/不小心,这会导致意外行为,所以我希望编译器做这个检查。