\0 当用循环初始化一个 char 数组时

\0 when initializing a char array with a loop

我需要用循环初始化一个字符数组并打印它。就这样:

int main( void )
{
    char array[ 10 ];

    for( int i = 1; i < 10; ++i ) {
        array[ i - 1 ] = i;
    }

    // array[] contains numbers from 1 to 9 and an unitialized subscript

    printf( "%s", array );
}

我想知道是否需要将 '[=11=]' 字符放入 array[ 9 ] 中,或者它是否已经存在。
换句话说:一旦我声明 char array[ 10 ]; 最后一个下标是否包含 '\0' ?

我搜索了类似的问题,我能找到的更好的是,其中数组充满了一个循环,但直到最后,没有为终止字符留下space。

如实告诉我。

once I declared char array[ 10 ]; does the last subscript contains '[=10=]' ?

没有。它是未初始化的。它在每个元素中都有垃圾值,这些值来自最后使用同一块内存的任何代码。

In other words: once I declared char array[ 10 ]; does the last subscript contains '[=14=]' ?

没有

您定义了一个局部变量,但没有对其进行初始化。默认情况下,这些变量未初始化,但包含不确定的值。 如果要有定义值,需要初始化或赋值:

char array[ 10 ] = "";

这将定义一个包含 10 个元素的数组。 由于有初始化器,第一个元素将根据提供的字符串文字设置为 0 (=='[=12=]')。 此外,所有其他元素都将设置为 0,因为您提供的初始化值少于数组中的元素。

不,您不需要在数组[9] 的末尾放置'\0'。 为什么?

因为当数组 (char,int,float) 未初始化时它包含垃圾值。 在初始化部分或全部之后,所有其他元素在 char 数组的情况下变为 0 或 \0。

示例: 字符数组[10];
所有元素都包含垃圾值。

初始化后

char array[10]={'a' ,'b'}; 所有其他元素自动变为 '\0'

对于结构也是如此。

once I declared char array[10]; does the last subscript contains '[=12=]' ?

答案是否定的:当你将数组定义为自动变量(函数中的局部变量)时,它是未初始化的。因此,可以假定其元素的 none 具有任何特定值。如果你初始化数组,即使是部分初始化,所有元素都将被初始化,或者显式地从初始化器中提供的值初始化,或者如果没有足够的初始化器则隐式地初始化到 0

0'[=12=]'是等价的,都是int表示0值的常量,习惯用'[=12=]'表示末尾的空字节char 数组,使其成为 C 字符串。请注意 '0' 是不同的东西:它是 0 数字的字符代码。在 ASCII 中,'0' 的值为 48(或 0x30),但一些古代计算机过去使用不同的编码,其中 '0' 具有不同的值。 C 标准规定从 09 的所有 10 个数字的代码必须是连续的,因此数字 n 的代码为 '0' + n.

请注意,代码中的循环将数组的 9 个元素的值设置为非零值,并使最后一个条目未初始化,因此数组不是空终止的,因此它不是 C 字符串。

如果要将 char 数组用作 C 字符串,则必须通过将 array[9] 设置为 '[=12=]' 来终止它。

另请注意,您可以通过在转换说明符中指定要输出的最大字节数作为 precision 字段来打印非空终止的 char 数组: %.9s.

最后,请注意array[0] = 1; 并没有在array 的第一个位置设置一个有效字符,而是一个可能无法打印的控制代码。 array[0] = '0' + 1; 设置字符 '1'.

#include <stdio.h>

int main(void) {
    char array[10];

    /* use the element number as the loop index: less error prone */
    for (int i = 0; i < 9; ++i) {
        array[i] = `0` + i + 1;
    }

    // array[] contains numbers from 1 to 9 and an unitialized subscript
    printf("%.9s\n", array);  // prints up to 9 bytes from `array`

    array[9] = '[=10=]';
    // array[] contains numbers from 1 to 9 and a null terminator, a valid C string
    printf("%s\n", array);  // produce the same output.
    return 0;
}