13

可能我对谷歌搜索太垃圾了,但我一直认为 char 数组只会由字面初始化 ( char x[]="asdf";) 终止,当我看到情况似乎并非如此时,我有点惊讶。

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

输出:0

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

4

3 回答 3

26

您正在访问其边界之外的未初始化数组。这是双重未定义行为,任何事情都可能发生,甚至0作为输出。

回答您的真正问题:只有字符串文字才能获得null-terminated,这意味着它char x[]="asdf"是一个5元素数组。

于 2012-06-27T15:14:54.897 回答
4

char数组不会自动以 NULL 结尾,只有字符串文字,例如char *myArr = "string literal";,以及从 stdlib 字符串方法返回的一些字符串 char 指针。

C 没有边界检查。因此,声明为 size 的数组为2*char您提供了 2 个可以使用的内存插槽,但您可以自由地在内存的任一侧遍历内存,读取和写入,从而调用未定义的行为。您可能会0在那里看到字节。您可能会写入array[-1]并崩溃您的程序。您有责任跟踪数组的大小并避免接触未分配的内存。

例如,通常将 char 数组用作简单的 char 数组,即不同于 C 字符串,以保存任意原始字节的缓冲区。

于 2012-06-27T15:21:04.763 回答
1

如果t是 size 的数组2,则最后一种情况是t[2 - 1] = t[1]而不是 2.t[2]超出范围。

于 2012-06-27T16:03:31.773 回答