首页 > 解决方案 > 是否必须为字符数组的初始化提供 '\0' ?

问题描述

请看代码:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char name[10] = {'L','e','s','s','o','n','s'}; // did not add `\0`
    char c;

    for (int i = 0; name[i] != '\0'; i++)
    {
        c = name[i];
        printf("%c", c);
    }

    return 0;
}

我最后没有给\0,但它仍然有效。

我的问题:\0在上述情况下是否自动添加?

编辑:在这些情况下会发生什么:

  1. char name[7] = {'L','e','s','s','o','n','s'};
  2. char name[8] = {'L','e','s','s','o','n','s'};

对于编辑问题,我深表歉意。

标签: arrayscc-strings

解决方案


在 C 中,任何类型的部分初始化的数组对于其余的都是 0 初始化的。所以,

int foo[5] = {1, 2, 3};

将初始化foo{1, 2, 3, 0, 0}. 因此,当您不添加'\0'到末尾时,不仅末尾将是'\0'(假设数组足够大以容纳它),而且数组的所有剩余元素都将是'\0'.

如果您的数组不够大,无法容纳空终止符,则不会添加它,该值甚至也不重要。读取数组末尾是未定义的行为,这可能导致段错误、垃圾数据或更糟。


推荐阅读