多维数组中的字符串没有终止NUL字符?

时间:2017-05-22 10:01:42

标签: c string

我试图打印多维数组的每个字符串,但在我看来,这些字符串没有NUL字符('\0')。

以下是我使用的代码:

int main(void)
{
    char    test[3][2] = {'1', '2', '3', '4', '5', '6'};

    printf("'%s'\n", test[0]);
    printf("'%s'\n", test[1]);
    printf("'%s'\n", test[2]);
    return 0;
}

输出如下:

'123456'
'3456'
'56'

以这种方式声明会产生相同的输出:

char    test[3][2] = {"12", "34", "56"};

我必须在每个字符串之后自己放一个NUL字符:

int main(void)
{
    char    test[3][3] = {'1', '2', 0, '3', '4', 0, '5', '6', 0};
    printf("'%s'\n", test[0]);
    printf("'%s'\n", test[1]);
    printf("'%s'\n", test[2]);
    return 0;
}

我也可以用这种方式声明我的多维数组:

char    test[3][3] = {{'1', '2'}, {'3', '4'}, {'5', '6'}};

输出:

'12'
'34'
'56'

这就是我所知道的:当声明一个字符串时,不需要在它的末尾声明以NULL结尾的字符。 str[3] = "123"将分配4个内存而不是3个内存,并将'\0'放在最后一个插槽中。

以下链接确认了它:http://www.lysator.liu.se/c/c-faq/c-2.html

但是为什么我们需要在数组内部的字符串末尾手动实现NUL字符?

1 个答案:

答案 0 :(得分:0)

两个

char    test1[3][2] = { "1", "3", "5" };

char    test2[3][3] = { "12", "34", "56" };

会奏效。

如果用一对引号(")包围一个或多个字符,编译器将知道你已经声明了一个字符串,并且它总是会分配一个额外的' \ 0'在字符串的末尾,占用一个额外的字节内存空间。这就是为什么我们总是声明具有一个额外字节空间的数组用于已知用途的原因,例如:使用数组char sz[6]来存储字符串" hello"。

另一方面,如果你用一对单引号(')包围一个字符,例如'a',它将被视为普通值,与int nNum相同。 'a'nNum之间的唯一区别是内存消耗('a'是1个字节而nNum是4个字节)。我们可以在没有强制类型转移的情况下将二者混合在一起,例如,

int nNum = 1; 
nNum = nNum + 'a';

这会将{charactor的ascii值' a'}添加到nNum本身,将nNum变为98.如果继续打印nNum像这样:

 printf("%c", nNum);

您将打印出字符'b'