logo

C의 memcpy()

memcpy() 함수는 메모리 블록 복사 함수라고도 합니다. 지정된 범위의 문자를 복사하는 데 사용됩니다. 이 함수는 두 메모리 블록이 어떤 지점에서도 겹치지 않는 경우에만 한 메모리 블록에서 다른 메모리 블록으로 객체를 복사할 수 있습니다.

통사론

C 언어에서 memcpy() 함수의 구문은 다음과 같습니다.

 void *memcpy(void *arr1, const void *arr2, size_t n); 

memcpy() 함수는 소스 배열이나 위치에서 지정된 n개의 문자를 복사합니다. 이 경우 목적지 위치인 arr2까지 arr1입니다. arr1과 arr2는 각각 소스 위치와 대상 위치를 가리키는 포인터입니다.

memcpy()에 전달된 매개변수 또는 인수

    도착1:이는 소스 메모리 블록의 위치를 ​​지정하는 함수의 첫 번째 매개변수입니다. 대상에 복사될 배열을 나타냅니다.arr2:함수의 두 번째 매개변수는 대상 메모리 블록의 위치를 ​​지정합니다. 이는 메모리 블록이 복사될 배열을 나타냅니다.N:소스에서 대상으로 복사되는 문자 수를 지정합니다.

반품

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 헤더 파일에 선언되어 있습니다. 따라서 프로그래머는 코드에 파일을 포함해야 합니다.
  • 콘텐츠가 복사될 버퍼의 크기는 버퍼에 복사될 바이트 수보다 커야 합니다.
  • 개체가 겹쳐지면 작동하지 않습니다. 겹치는 객체에 대해 기능을 수행하려고 하면 동작이 정의되지 않습니다.
  • 문자열에서 종료되는 널 문자를 확인하지 않으므로 문자열을 사용할 때 널 문자를 추가해야 합니다.
  • 함수가 크기를 초과하여 버퍼에 액세스하는 경우 함수 동작은 정의되지 않습니다. 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; } 

산출:

C의 memcpy()

새 포인터가 유효한 위치를 가리키지 않기 때문에 코드 동작이 정의되지 않았습니다. 따라서 프로그램이 제대로 작동하지 않습니다. 일부 컴파일러에서는 오류를 반환할 수도 있습니다. 위의 경우 대상 포인터가 유효하지 않습니다.

  • 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; } 

산출:

C의 memcpy()

이 경우 출력은 대상이 지정되지 않은 위의 경우와 유사합니다. 여기서 유일한 차이점은 컴파일 오류를 반환하지 않는다는 것입니다. 소스 포인터가 정의된 위치를 가리키지 않으므로 정의되지 않은 동작만 표시됩니다.

추상 클래스 자바
  • 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; } 

산출:

C의 memcpy()

여기서는 크기가 30인 두 배열을 초기화했습니다. sourcearr[]에는 destarr에 복사할 데이터가 포함되어 있습니다. destarr[]에 데이터를 저장하기 위해 memcpy() 함수를 사용했습니다.

정수형 데이터로 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
&apos;); 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[]=&apos;Ashwin&apos;; //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 ( &amp;prsn2, &amp;prsn1, sizeof(prsn1) ); //print the stored data //display the value stored after copying the data //from prsn1 to prsn2 printf (&apos;person2: %s, %d 
&apos;, 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) &amp;&amp; (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) &amp;&amp; (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] = &apos;How Are you ?&apos;; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf(&apos;dst = %s
&apos;, 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++){>

산출:

C의 memcpy()

위의 코드에서 구조를 정의했습니다. 우리는 memcpy() 함수를 두 번 사용했습니다. 처음으로 문자열을 prsn1에 복사하는 데 사용했고, 두 번째에는 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) &amp;&amp; (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; } 

위의 코드가 not에서 제대로 작동하는지 확인하기 위해 드라이버 코드를 작성해 보겠습니다.

MemCpy() 함수를 테스트하기 위한 드라이버 코드

아래 코드에서는 MemCpy() 함수를 사용하여 arr1을 사용하여 데이터를 arr2에 복사합니다.

DBMS의 산성 속성
 void * MemCpy(void* destinatn, const void* source, unsigned int cn) { char *pntDest = (char *)destinatn; const char *pntSource =( const char*)source; if((pntDest!= NULL) &amp;&amp; (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] = &apos;How Are you ?&apos;; //Source String char dst[20] = {0}; //dst buffer //copy source buffer int dst MemCpy(dst,src,sizeof(src)); printf(&apos;dst = %s
&apos;, dst); return 0; } 

산출:

C의 memcpy()