52 구조체와 메모리 활용하기

구조체도 변수를 선언하거나 메모리를 할당하면 결국 메모리 공간을 차지하게 되므로 메모리 관련 함수도 사용할 수 있게 됩니다. 이번에는 메모리 함수를 사용하여 구조체와 메모리에 값을 설정하는 방법과 구조체와 메모리의 내용을 복사하는 방법을 알아보겠습니다.

52.1 구조체와 메모리를 간단하게 0으로 설정하기

구조체의 멤버를 모두 0으로 만들려면 각 멤버에 접근하여 0을 저장했는데 꽤 번거로운 작업이었습니다.

// 구조체 멤버에 일일이 접근하여 0을 저장
구조체변수.멤버1 = 0;
구조체변수.멤버2 = 0;
구조체변수.멤버3 = 0;
구조체변수.멤버4 = 0;

구조체 변수를 선언할 때 { 0, }처럼 중괄호를 사용하여 0으로 초기화할 수 있었지만, 변수에만 사용할 수 있고 malloc 함수로 할당한 메모리에는 사용할 수 없었습니다.

struct 구조체이름 변수이름 = { 0, };    // 구조체 변수의 내용을 모두 0으로 초기화
                                      // 단 malloc 함수로 할당한 메모리에는 사용할 수 없음

일일이 멤버에 값을 설정하거나 중괄호를 사용하지 않고, 구조체 변수나 메모리의 내용을 한꺼번에 값을 설정하려면 memset 함수를 사용하면 됩니다.

  • memset(구조체포인터, 설정할값, sizeof(struct 구조체));

struct_variable_memory_set.c

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

struct Point2D {
    int x;
    int y;
};

int main()
{
    struct Point2D p1;

    memset(&p1, 0, sizeof(struct Point2D));    // p1을 구조체 크기만큼 0으로 설정

    printf("%d %d\n", p1.x, p1.y);    // 0 0: memset을 사용하여 0으로 설정했으므로
                                      // x, y 모두 0
 
    return 0;
}

실행 결과

0 0

memset 함수로 구조체 변수의 값을 설정할 때는 &p1과 같이 주소 연산자 &를 사용하여 변수의 메모리 주소를 구해서 넣어줍니다. 그리고 설정할 값과 크기를 넣어줍니다. 여기서는 구조체의 내용을 모두 0으로 설정했고, Point2D 구조체 크기만큼 값을 설정했습니다.

memset(&p1, 0, sizeof(struct Point2D));    // p1을 구조체 크기만큼 0으로 설정

printf 함수로 p1의 각 멤버를 출력해보면 모두 0이 나옵니다.

그림 52‑1 구조체 변수를 0으로 설정하기

이번에는 malloc 함수로 할당한 동적 메모리에 값을 설정해보겠습니다.

struct_pointer_memory_set.c

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

struct Point2D {
    int x;
    int y;
};

int main()
{
    struct Point2D *p1 = malloc(sizeof(struct Point2D));    // 구조체 크기만큼 메모리 할당

    memset(p1, 0, sizeof(struct Point2D));    // p1을 구조체 크기만큼 0으로 설정

    printf("%d %d\n", p1->x, p1->y);    // 0 0: memset을 사용하여 0으로 설정했으므로
                                        // x, y 모두 0

    free(p1);    // 동적 메모리 해제

    return 0;
}

실행 결과

0 0

memset 함수로 메모리에 값을 설정할 때는 포인터를 그대로 넣어줍니다. 왜냐하면 포인터는 안에 메모리 주소를 담고 있으므로 &를 사용하지 않아도 됩니다. 마찬가지로 설정할 값과 크기를 넣어줍니다.

memset(p1, 0, sizeof(struct Point2D));    // p1을 구조체 크기만큼 0으로 설정

여기서도 printf 함수로 p1의 각 멤버를 출력해보면 모두 0이 나옵니다.

그림 52‑2 메모리를 0으로 초기화하기

보통 memset 함수는 구조체나 메모리를 0으로 초기화 할 때 사용하지만 각 상황에 따라서 0이 아닌 다른 값으로 초기화 할 때도 사용할 수 있습니다.