为什么数组显示其中不存在的字符?
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"
存储在数组中。当你打印它时(通过告诉它你有一个字符串而你没有),它会越过数组的末尾并打印内存中发生的任何内容,直到它遇到一个空字节。
解决办法很简单:不要那样做。注意编译器警告——如果您的编译器没有警告您,了解如何让它打印更多警告。
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"
存储在数组中。当你打印它时(通过告诉它你有一个字符串而你没有),它会越过数组的末尾并打印内存中发生的任何内容,直到它遇到一个空字节。
解决办法很简单:不要那样做。注意编译器警告——如果您的编译器没有警告您,了解如何让它打印更多警告。