在下面的程序中,arr是一个长度为4的char数组。在C编译器中运行它时,我发现输出为tjyh。
#include <stdio.h>
int main() {
char arr[4];
arr[0]='t';
arr[1]='j';
arr[2]='y';
arr[3]='h';
printf("%s",arr);
return 0;
}
我很困惑,因为Null字符在哪里。由于字符串以“ \ 0”结尾,因此应该有空间容纳它。 “%s”如何知道何时停止。由于没有'\ 0',因此tjyh后应该有垃圾值,或者输出应该只是tjy,因为最后一个字符是'\ 0'代替了'h'。
编辑:好吧,我在Codechef编译器中运行了这段代码,输出为tjyh,没有垃圾值,如果您认为它也应该打印垃圾值,请告诉我打印多长时间垃圾值,因为我没有输入'\ 0',所以程序什么时候停止打印?
答案 0 :(得分:1)
由于没有'\ 0',因此tjyh之后应该有垃圾值……
您怎么知道那里没有'\0'
?您将字母放在arr[0]
,arr[1]
,arr[2]
和arr[3]
中。那之后你放了什么?没有。那你怎么知道那里有什么?
实际上,您定义的数组只有四个字节,char arr[4];
,因此编译器为您安排了很多空间。您不知道该阵列之外的内存是什么。您不知道那里是否有一个空字符。
因此,也许那里有一个空字符,当您执行printf("%s",arr);
时,它将打印您分配的四个字符,查看该空字符,然后停止。
在其他情况下,也许在更复杂的程序中,数组arr
之后可能还有其他数据,并且printf
不会在arr
之后看到空字符,并且不会停止。
以上是在简单的C实现中发生的情况。但是,编译器变得越来越复杂,并且编译器可能会认识到使用无终止字符串对printf
的调用会导致C标准未定义行为。在优化过程中,具有未定义行为的代码可能会以意想不到的方式进行转换,因此您的程序可能根本不会输出“ tjyh”。它可能会捕获或执行完全不同的代码。