关于与Null字符相关的程序的输出感到困惑

时间:2020-11-09 21:14:44

标签: arrays c string null character

在下面的程序中,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',所以程序什么时候停止打印?

1 个答案:

答案 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”。它可能会捕获或执行完全不同的代码。

相关问题