私は実際にはstring.h
の機能を「メモリ」機能とは考えていません。代わりに、それらはメモリのシーケンス内に含まれるデータを操作するため、それらを「配列」関数と考えることにします。対照的に、malloc
(および他のもの)は、実際には、メモリの領域内でデータを操作するのではなく、割り当てなどのメモリサービスを提供する。
特に、string.h
の関数は、メモリの割り当てや割り当て解除、または任意の形式のメモリ管理を処理しません。 char * strerror(int)
のような関数であっても、新しい文字列全体を作成するように見える場合でも、戻り値は実際には静的に割り当てられた文字列であるため、割り当ては行われません。他の関数はメモリブロックへのポインタを返す可能性がありますが、実際にはパラメータの1つ(例:memcpy
)です。または、サブストリング(strtok
)の開始位置へのポインター、または比較を表す整数(memcmp
)を返します。
一方、stdlib.h
は実際にはメモリではありません。 stdlib.h
の設計は、多数のプログラムが必要とするであろう汎用動作を提供することである。メモリ機能は、このような基本的な動作の例に過ぎない。しかし、exit
とsystem
のような他の関数も良い例ですが、メモリには適用されません。
今IMO string.h
内に配置されている可能性がstdlib.h
でいくつかの機能、特に、様々な変換関数(mbstowcs
、wcstombs
、atoi
、strtod
、等)、及び多分bsearch
とqsort
機能があります。これらの関数は、string.h
関数と同じ原則に従います(配列上で動作し、新たに割り当てられたメモリブロックを返さないなど)。
しかし、それはmalloc
、realloc
、calloc
とfree
機能をmem*
機能を組み合わせることには意味の多くを作っても、実用的な観点から、C標準ライブラリは次のように再編成するつもりはありませんされます。そのような変更は間違いなくコードを壊すでしょう。また、stdlib.h
とstring.h
はずっと長い間存在していて、そのような有用で基本的なライブラリであり、変更がおそらくほとんどの(または少なくとも多くの)Cコードを破壊する可能性があります。
これは、使用しているCライブラリの実装上の問題のようです。他のCライブラリは、memcpyをstdlibに移動することを選択するかもしれません。 – AgA
'malloc'と家族は動的メモリ割り当てを扱います。 'memcpy'と家族は一連のバイトを処理します。 'strcpy'と家族もやや異なった方法でバイト列を扱います。 –
@AgA:CライブラリがISO規格に準拠している場合、 'memcpy'は' stdlib.h'ではなく 'string.h'になります。 – Blastfurnace