2016-11-20 65 views
1

我只是想知道你能否爲我清理一些東西。c的printf函數如何在沒有 0的情況下知道如何停止?

讓我們有一些示例代碼來說明我的問題:

#include <stdio.h> 

int main(void) 
{ 
    char test[100]; 
    printf("%s",test); 
    return 0; 
} 

如果我沒有完全搞錯了,這應該輸出隨機要麼某些字符在這個內存地址之前,我宣佈它還是什麼,如果它是像在虛擬環境中一樣空虛。所以,這是我的理解。在我把東西放入之前的記憶被理解爲一個字符並寫入終端。例如ascii'a'= 97 = 01100001.這就是爲什麼它輸出'a'。可能是其他任何東西。或無。然後停止。

但如果我把在第一位置「A」,然後打印它像這樣:

test[0] = 'a' 
printf("%s",test); 

它將輸出「a」和另外給一些字符或什麼,然後停止。

這是我的理解陣列:一種陣列是一個指向第一個地址和括號內是所述地址的解引用添加次數的sizeof(類型)到它之後。

因此,在這種情況下,第一個例子中在內存中找到的隨機01100001(Ascii'a')應該與第二個例子中故意放置的01100001(Ascii'a')的printf不可區分。然而,當我運行printf時,我不會得到100個隨機輸出。我得到一個。而且我不假定隨機字段通常設置爲'\ 0'。

這意味着,我的理解一定是錯誤的地方。請幫助我瞭解我犯了我的錯誤。

+5

看起來像「未定義的行爲」將是你的發現的好名字。 – usr2564301

+2

的可能的複製[什麼時候的printf( 「%S」,字符\ *)停止打印?](http://stackoverflow.com/questions/2726301/when-does-printfs-char-stop-printing) –

+0

「如何c的printf函數知道如何停止沒有\ 0?「 - >'test [100]'沒有被初始化。所以它可以有一個'\ 0'。我們不知道它是「沒有\ 0」。 – chux

回答

6

它沒有,它是未定義的行爲。您的程序只是意外地打印了「」的預期值「」的值。

#include <stdio.h> 

int main(void) 
{ 
    char test[100]; 
    printf("%s",test); 
    return 0; 
} 

你不能指望上面的代碼做任何預測的,它可能會打印的東西,它會段錯誤,沒有辦法預測會有什麼實際發生,因爲這樣的程序的行爲是嚴格定義。

+0

所以,你說它可能會發生它打印出100個不同的未定義值? – TheCommoner282

+1

@ TheCommoner282是的,那將是一種行爲。由於它沒有定義,原則上它可以清除你的HD。但這當然是非常不可能的,也許是不可能的。 –

+0

好的,只是爲了澄清。你在說未定義的行爲。據我瞭解,它打印出一個由8位組成的內存部分,它讀取爲字符。所以,它只能把它們理解爲字符,不可以嗎?現在它一直持續到最後遇到「\ 0」爲止,對吧? – TheCommoner282

相關問題