字符数组 null 终止和长度 c



我正在编写一个函数来检查c中char数组的长度。它需要另一个参数,该参数设置了检查的限制。

int string_length(char* string, int maximum_length) {
int i = 0;
while(string[i] != '' && i < maximum_length) {
i++;
}
return i;
}

在这个答案中,提到了如果使用{}语法创建char数组,则该数组必须以null结尾。我用未终止的char数组调用上面的函数&结果是10(9个字母+1(。

char not_terminated_string[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };
int length = string_length(not_terminated_string, 100);
// length is 10

我不明白为什么会这样。

对于下一行,C编译器创建一个10char大小元素的数组,并放置前9个字符,在最后添加一个字符串分隔符。

char *a = "my string";

考虑以下线路;C编译器创建一个9char大小元素的数组,并放置字符。没有在最后添加字符串分隔符。如果第10个字节(字节号9(恰好有一个零值,那只是偶然的。

char b[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };

声明">如果使用{}";意思是,如果您希望能够将该char数组用作字符串(例如,能够在printf中使用它(,那么您应该自己添加一个字符串终止字符,例如;

char b[] = { 'm', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g', '' };

您的程序生成了十个,因为您定义了一个只有九个非null字符的数组,但它后面恰好又是一个非null字符串,然后是一个null字符。(从技术上讲,由于溢出数组,程序的行为不是由C标准定义的,而且程序可能会以其他方式错误地产生10,但这是最有可能发生的情况。(

声明char not_terminated_string[] = {'m', 'y', ' ', 's', 't', 'r', 'i', 'n', 'g' };not_terminated_string定义为九个char的数组,这些数组使用给定的字符进行初始化。没有空字符自动附加到此数组。

当程序将此数组传递给string_length时,该例程计算数组中的九个字符,然后尝试查看第十个字符。很可能,内存中的下一个字节不是空的,所以例程对其进行计数并查看第十一个字节。看起来1为空,所以例程停止并返回10。

最新更新