この関数は、文字列の開始からヌル文字の終了までの文字数をカウントします。
size_t wcslen(const wchar_t* sz)
{
size_t l = 0;
while (*sz++) ++l;
return l;
}
終了ヌル文字がない場合、この関数はそれを検出する必要がありますか?彼らはどのように検出しますか?ループに制限はありますか?それは確かに無限ではありませんか?
この関数は、文字列の開始からヌル文字の終了までの文字数をカウントします。
size_t wcslen(const wchar_t* sz)
{
size_t l = 0;
while (*sz++) ++l;
return l;
}
終了ヌル文字がない場合、この関数はそれを検出する必要がありますか?彼らはどのように検出しますか?ループに制限はありますか?それは確かに無限ではありませんか?
この関数は最初の 0 の値で停止します。sz パラメータの最後に 0 を持つ wchar_t がない場合、0 の値に達するまでメモリの残りの部分で続行します。
そして、それを行う機能はどうですか?長さの定義は「終端のヌル文字まで」です。関数の「より安全な」バージョンは、データが保持されたバッファの長さに対応する追加の最大長を取る場合があります。しかし、ヌル終了文字列の使用は C では普遍的であり、ほとんどの場合、この関数を呼び出している場合、それは関数呼び出しがポインタしか与えておらず、バッファの実際の長さがわからないためです。 .
実際には、入力に終端のヌル文字がない場合、バッファー オーバーランが発生し、バッファーの末尾を超えてメモリが読み取られます。そうするとき、遅かれ早かれ、0を含むバイトに遭遇し、それを文字列の終わりと見なすか、プロセスにマップされていないアドレスになってしまうでしょう。クラッシュします。
文字列に null ターミネータがない場合、動作は未定義です。何が得られるかはわかりません。
契約は、NUL で終了する文字列を提供することです。そうしないと、すべての賭けがオフになり、機能の動作が未定義になります。
null ターミネータがない場合 (メモリ空間がすべてゼロのないガベージで満たされているとは想像しがたいですが)、最終的にsz
はオーバーフローし、その後 NULL を逆参照しようとすると例外が発生します。