未初始化的字符数组

uninitialized character array

我在执行以下代码时得到了输出 "ma"。如果我的理解是正确的,则局部变量未初始化为 0。那么在这种情况下,%s 为什么会在 a1[2] 本身中找到 0?是不是我们无法预测这种情况下的输出,而我以某种方式得到了这个结果,但情况可能并非总是如此?

int main(void)
{
    char a1[10];
    a1[0]='m';
    a1[1]='a';
    a1[3]='j';
    printf("%s",a1);
    return(0);
}

是的,除非a1static注意,是自动局部变量,就这些运气。您的代码(片段)通过缺少终止 null.

生成 undefined behavior

恰好紧接的下一个字节是null,所以它打印正确。无法保证下次一定会成功。

FWIW,%s 格式说明符需要 string 并且 C 中 string 的定义是 null-终止的 char 数组。要复制准确的措辞,

If no l length modifier is present, the argument shall be a pointer to the initial element of an array of character type. [..] If the precision is not specified or is greater than the size of the array, the array shall contain a null character.


注意:与static变量的初始化有关,引用C11标准,章节§6.7.9,初始化,(强调我的

If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate. If an object that has static or thread storage duration is not initialized explicitly, then:

  • [...]

  • if it has arithmetic type, it is initialized to (positive or unsigned) zero;