memcpy() 関数は、メモリ ブロックのコピー関数とも呼ばれます。指定した範囲の文字のコピーを作成するために使用されます。この関数は、両方のメモリ ブロックがどの時点でも重複していない場合にのみ、あるメモリ ブロックから別のメモリ ブロックにオブジェクトをコピーできます。
構文
C 言語の memcpy() 関数の構文は次のとおりです。
Java ロングから int
void *memcpy(void *arr1, const void *arr2, size_t n);
memcpy() 関数は、ソース配列または場所から指定された n 文字をコピーします。この場合、arr1 から宛先の場所である arr2 までです。 arr1 と arr2 は両方とも、それぞれ送信元と宛先の場所を指すポインターです。
memcpy() で渡されるパラメータまたは引数
戻る
これは、arr1 であるポインターを返します。
ヘッダファイル
memcpy() 関数は string.h ヘッダー ファイルで定義されているため、関数を実装するにはそれをコードに含める必要があります。
#include
C プログラムで memcpy() 関数を実装する方法を見てみましょう。
//Implementation of memcpy() in C Programming #include #include int main(int argc, const char * argv[]) { //initializing a variable that will hold the result./* Create a place to store our results */ int res; //declare the arrays for which you want to copy the data and //in which you want to copy it char orgnl[50]; char copy[50]; //Entering a string the orgnl array strcpy(orgnl, 'This is the program for implementing the memcpy() in C Program'); //use the memcpy() function to copy the characters from the source to destination. res = memcpy(copy, orgnl, 27); // we have specified n as 27 this means it will copy the first 27 character of //orgnl array to copy array //set the value for last index in the copy as 0 copy[27] = 0; //display the copied content printf('%s ', copy); return 0; }
注: この関数はデータをコピーするだけでメモリ自体は初期化しないため、コピーされた配列の最後のインデックスを null に設定する必要があります。文字列は、文字列を終了するために null 値を期待します。
C プログラミングで memcpy() を実装する前に考慮すべき重要な事実:
- memcpy() 関数は、string.h ヘッダー ファイルで宣言されます。したがって、プログラマは、そのファイルをコードに確実に含める必要があります。
- コンテンツがコピーされるバッファのサイズは、バッファにコピーされるバイト数より大きくなければなりません。
- オブジェクトが重なっている場合は機能しません。重なっているオブジェクトに対して関数を実行しようとした場合の動作は未定義です。
- 文字列内の終端の null 文字はチェックされないため、文字列を使用する場合は null 文字を追加する必要があります。
- 関数がそのサイズを超えてバッファーにアクセスする場合、関数の動作は定義されません。 sizeof()関数を使用してバッファサイズを確認することをお勧めします。
- 宛先メモリ ブロックがシステムのメモリ内で有効であるかどうかは保証されません。
#include #include int main () { //The first step is to initialize the source and destination array. char* new; char orgnl[30] = 'Movetheobject'; //Print the contents before performing memcpy() function. printf('Before implementing memcpy() destination and source memory block respt is new = %s orgnl = %s ', new, orgnl); memcpy(new, orgnl, sizeof(orgnl)); //Display the content in both new and orgnl array after implementing memcpy. printf('After memcpy >> new = %s orgnl = %s ', new, orgnl); return 0; }
出力:
新しいポインターが有効な場所を指していないため、コードの動作は定義されていません。したがって、プログラムは正しく機能しません。一部のコンパイラでは、エラーが返される場合もあります。上記の場合、宛先ポインタは無効です。
- memcpy() 関数はソース バッファの検証も実行しません。
#include #include int main () { //The first step is to initialize the source and destination array. char new[10]= {1}; char *orgnl; //Print the contents before performing memcpy() function. printf('Before implementing memcpy() destination and source memory block respt is new = %s orgnl = %s ', new, orgnl); memcpy(new, orgnl, sizeof(orgnl)); //Display the content in both new and orgnl array after implementing memcpy. printf('After memcpy >> new = %s orgnl = %s ', new, orgnl); return 0; }
出力:
この場合の出力も、宛先が指定されていない上記の場合と同様になります。ここでの唯一の違いは、コンパイル エラーが返されないことです。ソースポインタが定義された場所を指していないため、未定義の動作が表示されるだけです。
- memcpy() 関数はデータのバイト レベルで動作します。したがって、望ましい結果を得るには、n の値は常にバイト単位である必要があります。
- memcpy() 関数の構文では、ポインタはソース メモリ ブロックと宛先メモリ ブロックの両方に対して void * と宣言されています。これは、ポインタを使用してあらゆる種類のデータを指すことができることを意味します。
さまざまなデータ型に対して memcpy() 関数を実装する例をいくつか見てみましょう。
char型データを使用したmemcpy()関数の実装
#include #include int main() { //initialize the source array, //the data will be copied from source to destination/ char sourcearr[30] = 'This content is to be copied.'; //this is the destination array //data will be copied at this location. char destarr[30] = {0}; //copy the data stored in the sourcearr buffer into destarr buffer memcpy(destarr,sourcearr,sizeof(sourcearr)); //print the data copied into destarr printf('destination array content is now changed to = %s ', destarr); return 0; }
出力:
ここでは、サイズ 30 の 2 つの配列を初期化しました。sourcearr[] には、destarr にコピーされるデータが含まれています。 memcpy() 関数を使用してデータを destarr[] に保存しました。
スリー・ラマヌジャン
整数型データを使用した memcpy(0 関数の実装)
#include #include int main() { //initialize the source array, //the data will be copied from source to destination/ int sourcearr[100] = {1,2,3,4,5}; //this is the destination array //data will be copied at this location. int destarr[100] = {0}; //copy the data stored in the sourcearr buffer into destarr buffer memcpy(destarr,sourcearr,sizeof(sourcearr)); //print the data copied into destarr printf('destination array content is now changed to '); for(int i=0;i<5;i++){ printf('%d', destarr[i]); }return 0;} < pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-4.webp" alt="memcpy() in C"> <p>In this code, we have stored the integers in the array. Both the arrays can store int datatype. We have used the indexes to print the elements of the destarr after copying the elements of the sourcearr into destarr.</p> <h3>Implementing the memcpy() function with struct datatype</h3> <pre> #include #include struct { char name[40]; int age; } prsn1, prsn2; int main() { // char firstname[]='Ashwin'; //Using the memcpy() function to copy the data from //firstname to the struct //add it is as prsn1 name memcpy ( prsn1.name, firstname, strlen(firstname)+1 ); //initialize the age of the prsn1 prsn1.age=20; //using the memcpy() function to copy one person to another //the data will be copied from prsn1 to prsn2 memcpy ( &prsn2, &prsn1, sizeof(prsn1) ); //print the stored data //display the value stored after copying the data //from prsn1 to prsn2 printf ('person2: %s, %d ', prsn2.name, prsn2.age ); return 0; } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-5.webp" alt="memcpy() in C"> <p>In the above code, we have defined the structure. We have used the memcpy() function twice. The first time we used it to copy the string into prsn1, we used it the second time to copy the data from the prsn1 to prsn2.</p> <h2>Define your memcpy() function in C Programming Language</h2> <p>Implementing the memcpy() function in the C Programming language is comparatively easy. The logic is quite simple behind the memcpy() function. To implement the memcpy() function, you must typecast the source address and the destination address to char*(1 byte). Once the typecasting is performed, now copy the contents from the source array to the destination address. We have to share the data byte by byte. Repeat this step until you have completed n units, where n is the specified bytes of the data to be copied.</p> <p>Let us code our own memcpy() function:</p> <h4>Note: The function below works similarly to the actual memcpy() function, but many cases are still not accounted for in this user-defined function. Using your memcpy() function, you can decide specific conditions to be included in the function. But if the conditions are not specified, it is preferred to use the memcpy() function defined in the library function.</h4> <pre> //this is just the function definition for the user defined memcpy() function. void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) && (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } </pre> <p>Let us write a driver code to check that above code is working properly on not.</p> <p>Driver Code to test MemCpy() Function</p> <p>In the code below we will use the arr1 to copy the data into the arr2 by using MemCpy() function.</p> <pre> void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) && (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } int main() { char src[20] = 'How Are you ?'; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf('dst = %s ', dst); return 0; } </pre> <p> <strong>Output:</strong> </p> <img src="//techcodeview.com/img/c-tutorial/16/memcpy-c-6.webp" alt="memcpy() in C"> <hr></5;i++){>
出力:
上記のコードでは、構造体を定義しました。 memcpy() 関数を 2 回使用しました。初めてこれを使用して文字列を prsn1 にコピーし、2 回目はデータを prsn1 から prsn2 にコピーするために使用しました。
C プログラミング言語で memcpy() 関数を定義する
C プログラミング言語での memcpy() 関数の実装は比較的簡単です。 memcpy() 関数の背後にあるロジックは非常に単純です。 memcpy() 関数を実装するには、送信元アドレスと宛先アドレスを char*(1 バイト) に型キャストする必要があります。型キャストが実行されたら、ソース配列の内容を宛先アドレスにコピーします。データをバイトごとに共有する必要があります。 n 個のユニットが完了するまでこの手順を繰り返します。ここで、n はコピーするデータの指定されたバイトです。
独自の memcpy() 関数をコーディングしてみましょう。
注: 以下の関数は実際の memcpy() 関数と同様に機能しますが、このユーザー定義関数では多くのケースがまだ考慮されていません。 memcpy() 関数を使用すると、関数に含める特定の条件を決定できます。ただし、条件が指定されていない場合は、ライブラリ関数で定義されている memcpy() 関数を使用することをお勧めします。
//this is just the function definition for the user defined memcpy() function. void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) && (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; }
上記のコードが正常に動作するかどうかを確認するドライバー コードを作成してみましょう。
MemCpy() 関数をテストするドライバー コード
以下のコードでは、arr1 を使用して、MemCpy() 関数を使用してデータを arr2 にコピーします。
void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) && (pntSource!= NULL)) { while(cn) //till cn the loop will be executed { //copy the contents from source to dest //the data should be copied byte by byte *(pntDest++)= *(pntSource++); //decrement the value of cn --cn; } } return destinatn; } int main() { char src[20] = 'How Are you ?'; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf('dst = %s ', dst); return 0; }
出力:
5;i++){>