是否所有char数组都自动以null结尾?

时间:2012-06-27 15:13:25

标签: c arrays string null-terminated

可能我只是因为谷歌搜索过于垃圾,但我一直认为char数组只能通过文字初始化(char x[]="asdf";)来终止,当我看到这似乎不是这样的时候会有点惊讶

int main()
{
    char x[2];
    printf("%d", x[2]);
    return 0;
}

输出:0

声明为size = 2 * char的数组不应该实际获得2个字符的大小吗?或者我在这里做错了什么?我的意思是将char数组用作简单的char数组而不是字符串是不常见的,或者是它?

3 个答案:

答案 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]超出界限。