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语句都是正确的.无论'我'是什么都没关系.
两种情况都通过访问数组越界来调用未定义的行为.您无法访问从索引0到9分配的项目的数组的索引10.因此,您需要将循环更改为i<10或可能发生的任何事情.它恰好打印出不同的值 - 因为您无法保证索引10处的字节打印内容.
在这两个示例中,都没有null终止符,因此它们是等效的.由于C语言中的一个微妙的,奇怪的规则(C17 6.7.9/14强调我的):
字符类型数组可以由字符串文字或UTF-8字符串文字初始化,可选地用大括号括起来.字符串文字的连续字节(如果有空间或数组大小未知,则包括终止空字符)初始化数组的元素.
通常,当尝试在数组中存储太多初始化时,我们会遇到编译器错误.但不是在这个非常具体的情况下使用字符串文字初始化程序,这是一种"语言错误".改为char arr2[9]="0123456789";,它不会编译.更改为char arr2[11]="0123456789";,即使迭代超过11个元素,它也会正常工作.