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

时间:2019-02-04 10:45:43

标签: c arrays string char

enter image description here

尽管我声明了两个char字符串,它们的内容相同,但输出却不同。

{{1}}

我希望两个if语句对于'i'的任何值都是正确的。'i'是什么都没关系。

3 个答案:

答案 0 :(得分:6)

这两种情况都通过超出范围访问数组来调用未定义的行为。您无法访问从索引0到9分配了项的数组的索引10。因此,您需要将循环更改为i<10,否则可能会发生任何情况。只是碰巧打印了不同的值-因为您无法保证在索引10的字节将打印什么内容。

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

  

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

通常,当尝试在数组中存储太多初始化时,会出现编译器错误。但是在这种非常特殊的情况下,不是使用字符串文字初始值设定项,后者是某种“语言错误”。更改为char arr2[9]="0123456789";,它将不会编译。更改为char arr2[11]="0123456789";,即使迭代11个元素,它也可以正常工作。

答案 1 :(得分: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语言中的字符串,数组索引和未定义的行为。

答案 2 :(得分:0)

使用双引号字符串初始化字符数组且未指定数组大小时,编译器会自动为字符串终止符“ \ 0”分配一个额外的空间

Ref