array
charがnull文字で終了する必要があるのはなぜですか?char
すべての配列にヌル文字を追加しなければならない理由はありますか?
彼らは同じように扱われるようです。
array
charがnull文字で終了する必要があるのはなぜですか?char
すべての配列にヌル文字を追加しなければならない理由はありますか?
彼らは同じように扱われるようです。
char配列はnullで終了する必要はありません(これに依存しない標準ライブラリ関数には、、、memcpy
-この最新のものに不適切な名前が付けられています-、memmove
正しいフォーマット文字列が含まれます)。strncpy
printf
NUL終了文字列(NTCS)は、定義上、NULで終了する必要があります。これは、C標準ライブラリの文字列処理ユーティリティで期待される形式であり、ほとんどのCプログラムで使用される規則です(C ++では通常使用されますstd::string
)
Cでは、配列へのポインターがある場合、その配列の長さを判別する方法はありません。@AProgrammerが指摘しているように、設計者はそれをそのままにして、プログラマーにすべての文字配列の長さを追跡するように強制することができました。ただし、それではCでのテキスト処理が以前よりもさらに難しくなります。
したがって、言語設計者は、文字列の終わりを示すヌル文字の存在によって文字列の長さを推測できるようにする規則に落ち着きました。
たとえば、次のことを考慮してstrcpy
ください。
char *strcpy(char *destination, const char *source);
destination
Cには、ポインタとsource
ポイントが指す配列の長さを決定する方法はありません。したがって、文字列の終わりを示す番兵値が存在しない場合、他の唯一の解決策は、source
文字列の長さを示す追加のパラメータを渡すことでした。
もちろん、最新のセキュリティ上の考慮事項に照らして、バッファ長パラメータを受け取る文字列処理関数が導入されました。しかし、nullで終了する文字列が発明されたとき、コンピューティングの状況は大きく異なっていました。
文字列として使用する場合のみ。次に、すべてのC / C ++文字列関数は、最後にnull文字を検索します。ヌル文字がない場合は、検索を続行し、遅かれ早かれアプリケーションがクラッシュします。
配列charを文字の配列としてのみ使用し、文字列として参照しない場合は、問題ありません。これは、intの配列とまったく同じです。
一般に、これを行う理由はありませんが、すべての文字列は、定義上、char
nullターミネータを持つ配列であることを知っておく必要があります。配列が文字列を表す場合char
、nullターミネータを省略すると、C文字列を処理するすべての関数が正しい値を返さないか、期待とは異なる動作をします。
ただし、は、、またはのchar
ようなタイプであるため、nullで終了する必要なしに、自由に配列を作成できます。int
float
double
char