簡體   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