繁体   English   中英

关于与空字符相关的程序输出的困惑

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM