1.memcpyメモリコピー機能
2.memmoveメモリ移動関数
3.memcmpメモリ比較関数
4.memsetメモリ設定関数
まず、strcpy 関数 (文字コピー関数) について以前学習しましたが、この関数には欠点があり、この strcpy 関数を使用して整数配列をコピーすると、次の 2 つの問題があります: 1. コピーの種類が異なる strcpy( char*, const char*) ;2. 文字コピー機能は、'\0' に遭遇すると停止します。配列がリトル エンディアン (01 00 00 00) で格納されている場合、00 に達するとコピーが停止します。
memcpy関数:
memcpy 関数はメモリブロックをコピーすることで実装されますが、コピーできるデータの種類に関係なく、C 言語のライブラリ関数における memcpy 関数の定義は次のようになります。 void * memcpy( void * dest, const void * src, size_t num (単位 memcpy 関数は重複しないメモリをコピーするために使用する必要がありますが、memmove 関数は重複するメモリ状況を処理できます。
なぜ char* 型へのキャストを考えたのですか?
これは、size_t num の単位がバイトであり、char* 型で移動する距離も 1 バイトであるためです。
次に、my_memcpy 関数を自分で実装してみましょう。
void* memcpy(void* dest, const void* src, size_t num){
assert(dest && src);
void* ret = dest;
while(num--){
*(char* )dest = *(char* )src;
dest = (char* )dest + 1;
src = (char* )src + 1;
}
return ret;
}
この自作関数は重複しない部分しかコピーできませんが、ライブラリ関数のmemcpyは重複する部分もコピーできます。
メモリ移動関数
memmove 関数はメモリの重複を処理できます。my_memmove 関数を実装する際の考え方は、ソース データを前から後ろへ、または後ろから前へコピーできるということです。ソース アドレスがターゲット アドレスより大きい場合は、前から後ろにコピーします。ソース アドレス + num がターゲット アドレスより小さい場合は、後ろから前にコピーします。
void* my_memmove(void* dest,const void* src,size_t num){
assert(dest && src);
void* ret = dest;
if(dest < src){
while(num--){
*(char* )dest = *(char* )src;
dest = (char* )dest + 1;
src = (char* )src + 1;
}
}
else{
while(num--){
*((char* )dest + num) = *((char* )src + num);
}
}
return ret;
}
memcmp関数
C 言語のライブラリ関数は int memcmp(const void* ptr1, const void* ptr2, size_t num) です。浮動小数点型を比較する場合は、浮動小数点ストレージに注意してください。
memset関数
C 言語のライブラリ関数は、 void* memset(void* ptr, int value, size_t num) です。メモリ内のコンテンツ番号を value に変更します。メモリをバイト単位で設定できるのが特徴です。