任何人都可以解釋爲什麼這代碼:爲什麼這兩個看似相同的聲明會導致不同的字符串長度?
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
感謝的
任何人都可以解釋爲什麼這代碼:爲什麼這兩個看似相同的聲明會導致不同的字符串長度?
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
感謝的
strlen
希望得到一個(指針)C字符串。 C字符串是以空字符'\0'
終止的char
的數組。
當你memset
你的char
數組,你只需在每個元素中寫一個'B'
,因此這兩個數組都不是C字符串。將它們傳遞給strlen
是未定義的行爲。
爲了解決這個問題,設置相應的每個數組的最後一個元素:
t1[19] = '\0';
t2[19] = '\0';
有趣的是,不同的編譯器似乎以不同的方式實現'memset'。 llvm鐺似乎把'\ 0'放在尾部,而gcc則沒有。無論如何,如果你以編程方式'空'終止'C字符串,你可以節省很多麻煩。 – user3078414
@ user3078414這是一個錯誤的假設:clang當然不會**後面的''\ 0''。你最可能目睹的是零堆棧空間和某種對齊方式(64位機器?)的組合,所以在數組結束後實際上有一個空字節**。 –
爲了準確,這個「*'strlen'期望得到一個(指向a的指針)* C string *。*」應該讀「*'strlen'期望得到一個(指向a的第一個元素的指針)* C string *。*「 – alk
注意,無論你得到的長度比實際的數組更長......你不必在一個空字符這個數組標記了字符串的末尾,所以'strlen()繼續前進直到它找到一個數組(在數組的末尾)。 – Dmitri
因爲你沒有終止任何字符串,所以你會得到垃圾結果。 –
不能重現該問題。 – user3078414