未初始化的字符数组
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);
}
是的,除非a1
是static
注意,是自动局部变量,就这些运气。您的代码(片段)通过缺少终止 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;
我在执行以下代码时得到了输出 "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);
}
是的,除非a1
是static
注意,是自动局部变量,就这些运气。您的代码(片段)通过缺少终止 null
.
恰好紧接的下一个字节是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;