[英]Confusion regarding output of a program related to Null character
在下面的程序中,arr 是一个长度为 4 的字符数组。在 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',那么tjyh之后应该是垃圾值……
你怎么知道那里没有'\\0'
? 您将字母放入arr[0]
、 arr[1]
、 arr[2]
和arr[3]
。 你在那之后放了什么? 没有。 那么你怎么知道那里有什么?
实际上,你定义了一个只有四个字节的数组, char arr[4];
,所以编译器为你安排了那么多空间。 您不知道该数组之外的内存中有什么。 您不知道那里是否有空字符。
所以,也许那里有一个空字符,而且,当你执行printf("%s",arr);
,它打印您分配的四个字符,看到空字符,然后停止。
在其他情况下,可能在更复杂的程序中,数组arr
之后可能还有其他数据,并且printf
不会在arr
之后看到空字符并且不会停止。
以上是在一个简单的 C 实现中发生的情况。 但是,编译器变得越来越复杂,编译器可能会认识到使用未终止的字符串调用printf
导致 C 标准未定义的行为。 在优化过程中,具有未定义行为的代码可能会以意想不到的方式进行转换,因此您的程序可能根本不会打印“tjyh”; 它可能会捕获或执行完全不同的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.