可能我只是因为谷歌搜索过于垃圾,但我一直认为char数组只能通过文字初始化(char x[]="asdf";
)来终止,当我看到这似乎不是这样的时候会有点惊讶
int main()
{
char x[2];
printf("%d", x[2]);
return 0;
}
输出:0
声明为size = 2 * char的数组不应该实际获得2个字符的大小吗?或者我在这里做错了什么?我的意思是将char数组用作简单的char数组而不是字符串是不常见的,或者是它?
答案 0 :(得分:21)
您正在访问其边界外的未初始化数组。这是双重未定义的行为,任何事情都可能发生,甚至将0
作为输出。
回答您的真实问题:只有字符串文字才能以null结尾,这意味着char x[]="asdf"
是5
元素的数组。
答案 1 :(得分:3)
char
数组不自动NULL终止,只有字符串文字,例如char *myArr = "string literal";
,以及从stdlib字符串方法返回的一些字符串char指针。
C没有边界检查。因此,声明为大小2*char
的数组为您提供了2个可以使用的内存插槽,但是您可以自由地遍历内存的任何一侧,读取和写入,从而调用未定义的行为。您可能会在那里看到0
个字节。您可以写信至array[-1]
并使您的计划崩溃。您有责任跟踪阵列的大小,避免触摸未分配的内存。
通常使用char数组作为简单的char数组,例如,除了C字符串之外,用于保存任何原始字节的任意缓冲区。
答案 2 :(得分:0)
如果t
是一个大小为2
的数组,则最后一种情况为t[2 - 1] = t[1]
而不是2. t[2]
超出界限。