2016-05-14 75 views
-2

任何人都可以解釋爲什麼這代碼:爲什麼這兩個看似相同的聲明會導致不同的字符串長度?

char t1[20]; 
char t2[20]; 

memset(t1, 'B', sizeof(t1)); 
memset(t2, 'B', sizeof(t2)); 
printf("%lu\n", strlen(t1)); 
printf("%lu\n", strlen(t2)); 

結果:

22 
21 

感謝的

+3

注意,無論你得到的長度比實際的數組更長......你不必在一個空字符這個數組標記了字符串的末尾,所以'strlen()繼續前進直到它找到一個數組(在數組的末尾)。 – Dmitri

+2

因爲你沒有終止任何字符串,所以你會得到垃圾結果。 –

+0

不能重現該問題。 – user3078414

回答

1

strlen希望得到一個(指針)C字符串。 C字符串是以空字符'\0'終止的char的數組。

當你memset你的char數組,你只需在每個元素中寫一個'B',因此這兩個數組都不是C字符串。將它們傳遞給strlen是未定義的行爲。

爲了解決這個問題,設置相應的每個數組的最後一個元素:

t1[19] = '\0'; 
t2[19] = '\0'; 
+0

有趣的是,不同的編譯器似乎以不同的方式實現'memset'。 llvm鐺似乎把'\ 0'放在尾部,而gcc則沒有。無論如何,如果你以編程方式'空'終止'C字符串,你可以節省很多麻煩。 – user3078414

+1

@ user3078414這是一個錯誤的假設:clang當然不會**後面的''\ 0''。你最可能目睹的是零堆棧空間和某種對齊方式(64位機器?)的組合,所以在數組結束後實際上有一個空字節**。 –

+0

爲了準確,這個「*'strlen'期望得到一個(指向a的指針)* C string *。*」應該讀「*'strlen'期望得到一個(指向a的第一個元素的指針)* C string *。*「 – alk

相關問題