mencpy関数実装

2133 ワード

memcpy関数は、リソースメモリ(srcが指すメモリ領域)をターゲットメモリ(destが指すメモリ領域)にコピーするために使用されます.コピーは何個ですか.size変数制御があります.
コピーのバイト数;
関数プロトタイプ:void*memcpy(void*dest,void*src,unsigned int count);
使用法:(1)関数のパラメータタイプがvoid*(タイプポインタが定義されていない)であるため、(1)任意のタイプのオブジェクトをコピーできます.すなわち、入力された実パラメータはint*、short*、char*などです.
しかし、関数コピーのプロセスは1バイト1バイトのコピーであるため、実際に動作するときはvoid*を強制的にchar*に変換し、ポインタが加算されるたびに1バイトずつ加算されることを保証します.
関数ソースの実装:
void *memcpy1(void *desc,const void * src,size_t size)
{
 if((desc == NULL) && (src == NULL))
 {
  return NULL;
 }
 unsigned char *desc1 = (unsigned char*)desc;
 unsigned char *src1 = (unsigned char*)src;
 while(size-- >0)
 {
  *desc1 = *src1;
  desc1++;
  src1++;
 }
 return desc;
}

int _tmain(int argc, _TCHAR* argv[])
{
 int dest[2] = {0};
 const char src[5] = "1234";
 //printf(src);
 memcpy1(dest,src,sizeof(src));
 //*(dest+5) = '/0';
 printf((char *)dest);
 int m = -1;
 return 0;
}
注意事項
:
(1)void*は必ず1つの値(ポインタ)を返します.これはvoidとは違います!(2)まずポインタの値が空ではないと判断します.descが空であればメモリ空間をコピーできないに違いありません.srcが空であればコピーがないに相当します.だから間はreturnが落ちます.(3)「空列とは内容が0で、NULLが0で、列ではありません.2つは等価ではありません.(4)int dest[2]={0};これはintタイプの配列を初期化する方法です.charタイプの場合はchar a[5]=「1234」を用いる.配列の下付き文字は実際に見た文字数より多いことに注意してください.'/0'(5)printf((char*)dest)もあるからです.この言葉は、charタイプsrcをintタイプのdestに転送するメモリを強制的にcharタイプに変換し、印刷します.intタイプのdestを直接見ると中身が見えないからです.unsigned char*desc 1=(unsigned char*)descがあるからです.したがって文字はdestに転送されて保存され、destが指すメモリ長は4バイトであり、強制的にcharに変換することは4バイトを1つ1つのバイトに分けることであり、char dest[5]=「1234」と定義されている場合、1つの文字が表示される.変換する必要はありません.(6)memcpy1(dest,src,sizeof(src));文字列の終端記号'/0'を含むsizeof(src)に注意してください.だからprintf(dest)を心配する必要はありません.しかしmemcpy 1(dest,src,4)を用いると;'/0'がなければ*(dest+5)='/0';これにより、完全な文字列であることが保証されます.
(7)初期化時:char dest[1024]="12345666";//{0};const char src[5]="3333";コピー時にmemcpy 1(dest,src,sizeof(src);printf(dest);出てくるのは3333 memcpy 1(dest,src,4);printf(dest);出てきたのは33335666です.上のsizeof(src)には'/0'が含まれているので、コピーした文字列は'/0'で終わるのは3333しかありませんが、4文字を渡すと'/0'が5文字目になるとdest[1024]の'/0'で終わるので、33335666文字列の'/0'の問題に注意しましょう!!