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

Why is Array Showing characters which are not there in it?

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

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

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

注意:一些 C 编译器会警告这种类型的 char 数组初始化,并且 C++ 会在尝试使用数组中不适合的字符串文字初始化 char 数组(包括空终止符)。

这一行就是问题所在

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

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

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

char chararray2[3]="savn";

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

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

解决办法很简单:不要那样做。注意编译器警告——如果您的编译器没有警告您,了解如何让它打印更多警告。