为什么数组显示不存在的字符?

时间:2016-02-14 10:06:35

标签: arrays string size

arrayfunc()
{
    char chararray[]="savn"; //initialization of char array.
    char chararray1[5]="savn";// another way of initialization.
    char chararray2[3]="savn";// check this

    printf("chararray[]: %s, chararray1[7]: %s, chararray2[5]: %s ",chararray,chararray1,chararray2);
    //check the above line.
}

当我执行上面的程序时,我得到前两个数组正确显示为什么最后一个数组显示超过其大小的字符串,任何C天才可以回答吗?

这是我得到的输出 this is the output

3 个答案:

答案 0 :(得分:1)

char chararray2[3]="savn";不会终止字符串 - 您会获得一个数组,其元素已初始化为's''a''v'。所以它实际上不是C风格的字符串,因为没有空终止字符。

使用printf() "%s"格式规范显示它是未定义的行为(导致为您显示垃圾)。

注意:一些C编译器将警告这种char数组初始化,并且当尝试初始化具有不适合数组的字符串文字的char数组时C ++会出错(包括null终止)。

答案 1 :(得分:1)

这一行是问题

 char chararray2[3]="savn";// check this

您已将数组设为三个字符。它将填充字符sav - 没有空字符。

当打印字符串时,它将打印这些字符,然后继续打印,直到找到空字符或者出现分段错误。

答案 2 :(得分:1)

Map

这是约束违规,需要编译时诊断。 C允许您使用与数组完全相同的字符串文字初始化char chararray2[3]="savn"; 数组;在这种情况下,没有终止空字符,并且该数组不包含字符串。但是你不能使用比数组更长的初始化器。

你的编译器不会拒绝声明(它可能有,并且它应该有恕我直言)。显然它将前3个字符char存储在数组中。当你打印它时(通过告诉你,当你不知道你有一个字符串时,它会躺到"sav"),它会越过数组的末尾并打印出内存中发生的任何内容,直到遇到空字节为止

解决方案很简单:不要这样做。注意编译器警告 - 如果您的编译器没有提醒您这一点,请找出如何使其打印更多警告。