我正在学习 C,我的教程中 char 数组的概念似乎与我观察到的相冲突。
#include <stdio.h>
int main(){
char input[64];
printf("%c is found for the last indexn", input[64]);
return (0);
}
根据教程,此 char 数组最多可容纳 63 个字符,加上字符串末尾的空字符 64。
但它输出( is found for the last index
,它既不为空也不显示 \0 个字符。我在这里缺少什么来理解?还是我的编译器行为不理想?
首先,input[64]
超出了范围。C 使用从零开始的数组,因此此处只有索引 0..63 有效。超出范围元素的读取会导致获得不可预知的数据,超出范围写入可能会导致程序数据和代码崩溃。(顺便说一句,超出字符串缓冲区范围的访问是程序安全漏洞的一个非常常见的原因。
其次,您使用的数组没有初始化,因此您可能会获得任何元素的任何不可预测(垃圾,随机)值。要用零初始化它,你可以写
char input[64] = {0};
第三,字符串和字符数组不是一回事。每个字符串文字(如"Hello, world"
都是以零结尾的字符串,包含 12 个字符串字符和 1 个零字符,正确调用的每个标准字符串都会将一个以零结尾的字符串保存到 char 数组(以前分配的字符串缓冲区)中。要将这样的字符串存储在缓冲区(数组)中,该数组应该为每个字符和零字符提供一个空间。但是不是任何字符数组都应该包含字符串,它可以只是任何字符的数组,而不是以零结尾的字符串处理。要保存示例中的字符串,您可以使用
char input[64] = "Hello, world";
但只有input[12]
是' '
(零字符),input[13]
..input[63]
仍将未初始化。
这个 char 数组 aka 字符串没有初始化,所以它只指向一个长度为 64 字节的数据,保留给你使用,直到你为它设置一个值,它指向的数据就是它拥有的"垃圾"随机数据。 如果再次运行它,您可能还会得到各种结果。
请注意,即使将值设置为字符串,最后一个使用的字符之后的下一个字符确实为 null,但在该 null 之后仍然会有垃圾数据。
此外,正如我在其他评论中看到的那样,索引 64 是越界的,在跟踪其长度的容器中,你会得到一个错误,最后一个字符是size - 1
,意思是 63。
但它输出(
找到最后一个索引,该索引既不为空也不