也许我只是太愚蠢了,无法通过搜索找到答案,但我一直认为字符数组只能通过字面量初始化(char x[]="asdf";
)才会得到空终止符,当我发现这似乎不是这种情况时有点惊讶。
int main()
{
char x[2];
printf("%d", x[2]);
return 0;
}
输出:0
一个声明尺寸为2*char的数组不应该得到两个字符的大小吗?或者我在这里做错了什么?我的意思是,使用字符数组作为简单的字符数组而不是字符串并不常见,或者是吗?
也许我只是太愚蠢了,无法通过搜索找到答案,但我一直认为字符数组只能通过字面量初始化(char x[]="asdf";
)才会得到空终止符,当我发现这似乎不是这种情况时有点惊讶。
int main()
{
char x[2];
printf("%d", x[2]);
return 0;
}
输出:0
一个声明尺寸为2*char的数组不应该得到两个字符的大小吗?或者我在这里做错了什么?我的意思是,使用字符数组作为简单的字符数组而不是字符串并不常见,或者是吗?
您正在访问一个未初始化的数组,超出了它的边界。这是双重的未定义行为,任何事情都可能发生,甚至会得到0
作为输出。
回答您的实际问题:只有字符串字面值才被空字符终止,这意味着char x[]="asdf"
是一个由5
个元素组成的数组。
char
数组并不会自动地以NULL字符('\0')结尾,只有字符串字面量如char *myArr = "string literal";
和一些由stdlib库的字符串方法返回的字符串指针才是以NULL字符结尾的。
C语言没有边界检查。因此声明大小为2*char
的数组会给你两个可以使用的内存槽位,但你可以在其两边自由读写内存,从而引发未定义行为。你可能会看到那里的0
字节。你可能会写入array[-1]
并导致程序崩溃。你有责任跟踪你的数组大小并避免触及你没有分配的内存。
通常,char数组被用作简单的字节数组,即除了C字符串外,例如用于保存任意原始字节缓冲区。
t
是大小为2
的数组,则最后一个情况是t [2-1] = t [1]
而不是2。t [2]
越界了。