C언어 : memcpy함수

지환·2022년 1월 31일
0

C언어

목록 보기
32/37
post-thumbnail

출처 | https://dojang.io/mod/page/view.php?id=439

memcpy함수에 대해 알아보자.

<코드>

#include <stdio.h>
#include <string.h>    // memcpy 함수가 선언된 헤더 파일

struct Point2D {
    int a;
    int b;
};

int main()
{
    struct Point2D abb1;
    struct Point2D tbb2;

    abb1.a = 30;    // p1의 멤버에만 값 저장
    abb1.b = 40;    // p1의 멤버에만 값 저장

    memcpy(&tbb2, &abb1, sizeof(struct Point2D));    // Point2D 구조체 크기만큼 p1의 내용을 p2로 복사

    printf("%d %d\n", tbb2.a, tbb2.b);    // 30 40: p1의 내용을 p2로 복사했으므로 30 40

    return 0;
}

<결과>

  • memcpy(&p2, &p1, sizeof(struct Point2D));
    &p2 : 목적지 포인터
    &p1 : 원본 포인터
    <-(방향)

<malloc 함수를 사용한 memcpy복사>


#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
#include <string.h>    // memcpy 함수가 선언된 헤더 파일

struct Point2D {
    int a;
    int b;
};

int main()
{
    struct Point2D* abb1 = malloc(sizeof(struct Point2D));
    struct Point2D* tbb2 = malloc(sizeof(struct Point2D));

    abb1->a = 30;    // p1의 멤버에만 값 저장
    abb1->b = 40;    // p1의 멤버에만 값 저장

    memcpy(tbb2, abb1, sizeof(struct Point2D));    // Point2D 구조체 크기만큼 p1의 내용을 p2로 복사

    printf("%d %d\n", tbb2->a, tbb2->b);    // 30 40: p1의 내용을 p2로 복사했으므로 30 40

    free(tbb2);
    free(abb1);

    return 0;
}

<결과>

  • 앞 부분과 차이점은 포인터 변수를 선언했기 때문에 &를 사용하지 않았다.
  • 지금까지
  1. 구조체 변수 -> 구조체 변수
  2. 동적 메모리 -> 동적 메모리 내용을 복사
  3. 구조체 변수 -> 동적 메모리로,
  4. 동적 메모리 -> 구조체 변수로 내용 복사도 할 수 있다.

<구조체 변수에서 동적 메모리로 복사>

<1>
struct Point2D abb1;
struct Point2D *tbb2 = malloc(sizeof(struct Point2D));

memcpy(tbb2, &abb1, sizeof(struct Point2D));    

<2>

struct Point2D *abb1 = malloc(sizeof(struct Point2D));
struct Point2D tbb2;

memcpy(&tbb2, abb1, sizeof(struct Point2D)); 
profile
아는만큼보인다.

0개의 댓글