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

时间:2011-02-18 00:42:31

标签: 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);
}

运行此代码打印出来

aaaaa♣

我已经读过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);
}

我得到的输出是:

aaaaa

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]);
    }
}

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

97
97
97
97

5 个答案:

答案 0 :(得分:5)

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

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 */

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

char j[5] = "aaaa";  /* initialize to {'a', 'a', 'a', 'a', '\0'} */

答案 1 :(得分:1)

在这两种情况下,您都使用期望0终止的函数打印char 数组而不使用0终止

在每个字符串上添加一个'\ 0'(不包括带有5个字符的字符串)

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

此外,您的阵列长度为5个字符/字节,而不是6.您可以在其中存储4个字符+ 0终结点,而不是5个字符+ 0终结点。

对于%d循环,您将每个'a'打印为整数。传递给printf的“%d \ n”字符串自动以0结尾,因此输出为97\n

答案 2 :(得分:1)

The char array is one byte longer than I'm using. I suspect this is why I don't see that odd character at the end of the string?

不是真的,如果你只添加了4个元素,那么第5个就是巧合。对于第5个字符,您应该完成此j[4] = '\0';,在这种情况下,下一个内存地址可能有\0值。

But, in the output, I see no nullbyte

那是因为你只打印前4个字符(见你的循环)。

答案 3 :(得分:0)

在构造像这样的字符串时需要将空字符放在自己身上。

唯一一次不设置字符串文字......

char *str = "this is a string";

编译器会在最后弹出\0

CodePad.org

答案 4 :(得分:0)

没有空字节,因为您只打印了前四个字节。 null是第五个。此外,除非使用编译器生成的字符串(例如“string”),否则需要手动设置空字节。你的代码现在工作的唯一原因是字符串所在的内存恰好是0。至于要求空字节,c字符串用它来表示字符串的结尾。它并不总是用于数组,但只要数组被解释为字符串就需要存在。