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