char数组是否需要比您打算使用的字节大一个字节?- C

dav*_*ave 1 c arrays char

我开始学习C并且在数组方面有点困惑.

#include <stdio.h>

int main()
{
    int i;
    char j[5];

    for (i = 0; i < 5; i++)
    {
        j[i] = 'a';
    }

    printf("%s\n", j);
}
Run Code Online (Sandbox Code Playgroud)

打印出来运行此代码

aaaaa?
Run Code Online (Sandbox Code Playgroud)

我已经读过char数组需要比字符串长一个字节,所以编译器可以放在\0最后.如果我用这个替换代码:

#include <stdio.h>

int main()
{
    int i;
    char j[5];

    for (i = 0; i < 4; i++)
    {
        j[i] = 'a';
    }

    printf("%s\n", j);
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

aaaaa
Run Code Online (Sandbox Code Playgroud)

char数组比我使用的长一个字节.我怀疑这就是为什么我没有在字符串的末尾看到那个奇怪的字符?

我尝试用以下代码测试这个理论:

#include <stdio.h>

int main()
{
    int i;
    char j[5];

    for (i = 0; i < 4; i++)
    {
        j[i] = 'a';
    }

    for (i = 0; i < 4; i++)
    {
       printf("%d\n", j[i]);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,在输出中,我看不到nullbyte.这是因为它只会在作为字符串输出时添加吗?

97
97
97
97
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 6

添加空字节是你的工作.编译器不一定会为您执行此操作.局部变量通常在运行时保持未初始化.

int i;
char j[5];    /* five uninitialized characters, could be anything */

for (i = 0; i < 4; i++)
{
    j[i] = 'a';
}

j[4] = '\0';  /* explicitly add null terminator */
Run Code Online (Sandbox Code Playgroud)

请注意,如果您使用字符串初始值设定项而不是手动设置每个字符,则编译器将处理为您添加空终止符:

char j[5] = "aaaa";  /* initialize to {'a', 'a', 'a', 'a', '\0'} */
Run Code Online (Sandbox Code Playgroud)