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