[06] 구조체 멤버값 설정 (memset)

구조체와 메모리 활용하기

참고 문헌 (Ch 52): https://dojang.io/mod/page/view.php?id=438

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

구조체 변수나 메모리의 내용을 한꺼번에 값을 설정하려면 memset 함수를 사용

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

예시 - 구조체 변수를 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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;
}

예시 - malloc으로 만들어진 배열을 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#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
// 출력: 0 0

// 0 이 아닌 값을 넣는 경우 => 값이 이상한 것 같음
memset(p1, 1, sizeof(struct Point2D));
printf("%d %d\n", p1->x, p1->y);
// 출력: 16843009 16843009

memset(p1, 2, sizeof(struct Point2D));
printf("%d %d\n", p1->x, p1->y);
// 출력: 33686018 33686018

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

return 0;
}

구조체와 메모리 복사하기

아주 중요한 기능!!

이미 생성하여 값을 저장한 구조체나 메모리를 다른 곳에 복사할 경우 이용

memcpy( 목적지포인터 , 원본포인터 , 크기); => 목적지 포인터를 반환

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <string.h> // memcpy 함수가 선언된 헤더 파일

struct Point2D {
int x;
int y;
};

int main()
{
struct Point2D p1;
struct Point2D p2;

p1.x = 10; // p1의 멤버에만 값 저장
p1.y = 20; // p1의 멤버에만 값 저장

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

printf("%d %d\n", p2.x, p2.y); // 10 20: p1의 내용을 p2로 복사했으므로 10 20

return 0;
}
// 사이즈가 같은 경우 위와 같이 되는데 다른 경우는 어떻게 될까?

복사하는 포인터와 목적지 포인터의 사이즈가 다를 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <stdio.h>
#include <string.h> // memcpy 함수가 선언된 헤더 파일

struct Point2D {
int x;
int y;
};

struct Point1D {
int x;
};

struct Point3D {
int x;
int y;
int z;
};


int main()
{
struct Point1D p1;
struct Point2D p2;
struct Point3D p3;

p2.x = 10; // p1의 멤버에만 값 저장
p2.y = 20; // p1의 멤버에만 값 저장

memcpy(&p1, &p2, sizeof(struct Point1D)); // Point2D 구조체 크기만큼 p2의 내용을 p1로 복사
printf("%d \n", p1.x); // 10: p2의 내용을 p1로 복사, 한 칸만 복사했으므로 10

memcpy(&p3, &p2, sizeof(struct Point3D)); // Point2D 구조체 크기만큼 p2의 내용을 p3로 복사
printf("%d %d %d\n", p3.x, p3.y, p3.z); // 10 20 10: p2의 내용을 p3로 복사 3칸을 복사했는데, 부족한지 맨 첫 값이 다시 나옴

// 그 외에도 메모리 사이즈가 작은 데이터를 큰 데이터로 옮기는 경우, 해당하는 범위를 넘어서면 원래 값이 남아있다.
return 0;
}