两个不同的字符数组的混乱输出

问题描述 投票:3回答:2

虽然我声明了两个字符的字符串,其内容是一样的,产出是不同的。

    #include <stdio.h>
    int main(){

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

    for(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);
    }
  • 我预计双方if语句将是任何种类的价值真正的“我”。
c arrays string char
2个回答
6
投票

这两种情况下通过访问阵列越界调用未定义的行为。你不能从索引0分配到9项访问数组的索引10因此,你需要改变环路i<10或任何可能发生的事情。这正好是不同的值被印刷 - 因为你不知道什么会被打印在指数10字节的保证。

在这两个例子中,没有空终结,所以他们是等价的。由于C语言(C17 6.7.9 / 14重点煤矿)一个微妙的,怪异的规则:

字符类型的阵列可以由一个字符串文字或UTF-8字符串文字进行初始化,任选在大括号。字符串文字的连续字节(包括终止空字符,如果有房间或如果阵列是未知大小的)初始化所述阵列的所述元件。

通常情况下试图太多初始化存储阵列内部时,我们得到一个编译错误。但不是在一个字符串初始化,这是一个“语言错误”各种各样的这种非常特殊的情况。更改为char arr2[9]="0123456789";,它不会编译。更改为char arr2[11]="0123456789";并遍历11元时,它会工作得很好,甚至。


3
投票

有几个小东西你的代码错误,并假设你似乎使这件事。

1.这两个声明是不一样的

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

第二行是等于以下内容:

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

...定义的含11个元素的阵列。检查出隐含的零终止字符串字面量。

编辑:我得到了很多的向下票这一点特别。请参考下面Lundin的评论,其中澄清了问题。

2.您的for循环遍历11种元素

for(i=0 ; i<11 ;++i)

上面的循环经过I = 0..10,这是11个元素....但你只是想比较前10吧?

你可以改变你的循环只比较第一十个元素[for(i = 0; i < 10; ++i)]正如你预料这将使您的工作方案。

因为什么,似乎我们假定你是,我会建议在C,数组索引和不确定的行为串读了。

© www.soinside.com 2019 - 2024. All rights reserved.