混淆两个不同Char Array的输出

nev*_*glu 3 c arrays string char

在此输入图像描述

虽然我声明了两个char字符串,其内容相同,但输出不同.

#include <stdio.h>

int main(void)
{
    /* Initialization of two different array that We deal with */

    char arr1[10]={'0','1','2','3','4','5','6','7','8','9'};
    char arr2[10]="0123456789";

    /* Initialization End */

    for(int i = 0 ; i < 11 ; ++i)
    {
        printf("arr1[%d] is %c \t\t",i,arr1[i]);
        printf("arr2[%d] is %c\n",i,arr2[i]);

        if(arr1[i]=='\0')
            printf("%d . character is \\0 of arr1 \n",i);

        if(arr2[i]=='\0')
            printf("%d . character is \\0 of arr2 \n",i);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我预计,对于'i'的任何值,两个if语句都是正确的.无论'我'是什么都没关系.

Lun*_*din 6

两种情况都通过访问数组越界来调用未定义的行为.您无法访问从索引0到9分配的项目的数组的索引10.因此,您需要将循环更改为i<10或可能发生的任何事情.它恰好打印出不同的值 - 因为您无法保证索引10处的字节打印内容.

在这两个示例中,都没有null终止符,因此它们是等效的.由于C语言中的一个微妙的,奇怪的规则(C17 6.7.9/14强调我的):

字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.

通常,当尝试在数组中存储太多初始化时,我们会遇到编译器错误.但不是在这个非常具体的情况下使用字符串文字初始化程序,这是一种"语言错误".改为char arr2[9]="0123456789";,它不会编译.更改为char arr2[11]="0123456789";,即使迭代超过11个元素,它也会正常工作.