虽然我声明了两个字符的字符串,其内容是一样的,产出是不同的。
#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);
}
这两种情况下通过访问阵列越界调用未定义的行为。你不能从索引0分配到9项访问数组的索引10因此,你需要改变环路i<10
或任何可能发生的事情。这正好是不同的值被印刷 - 因为你不知道什么会被打印在指数10字节的保证。
在这两个例子中,没有空终结,所以他们是等价的。由于C语言(C17 6.7.9 / 14重点煤矿)一个微妙的,怪异的规则:
字符类型的阵列可以由一个字符串文字或UTF-8字符串文字进行初始化,任选在大括号。字符串文字的连续字节(包括终止空字符,如果有房间或如果阵列是未知大小的)初始化所述阵列的所述元件。
通常情况下试图太多初始化存储阵列内部时,我们得到一个编译错误。但不是在一个字符串初始化,这是一个“语言错误”各种各样的这种非常特殊的情况。更改为char arr2[9]="0123456789";
,它不会编译。更改为char arr2[11]="0123456789";
并遍历11元时,它会工作得很好,甚至。
有几个小东西你的代码错误,并假设你似乎使这件事。
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,数组索引和不确定的行为串读了。