メモリ機能の内容と一部実装

     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 に変更します。メモリをバイト単位で設定できるのが特徴です。

おすすめ

転載: blog.csdn.net/2301_77868664/article/details/130512971