52.0 구조체와 메모리 활용하기
구조체도 변수를 선언하거나 메모리를 할당하면 결국 메모리 공간을 차지하게 되므로 메모리 관련 함수도 사용할 수 있게 됨.
1. 메모리 함수를 사용하여 구조체와 메모리에 값을 설정하는 방법
2. 구조체와 메모리의 내용을 복사하는 방법
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 구조체));
#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
return 0;
}
memset 함수로 구조체 변수의 값을 설정할 때는 &p1과 같이 주소 연산자 &를 사용하여 변수의 메모리 주소를 구해서 넣어줌.
printf 함수로 p1의 각 멤버를 출력해보면 모두 0이 나옴.
malloc 함수로 할당한 동적 메모리에 값을 설정
#include <stdio.h>
#include <stdlib.h>
#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
free(p1);
return 0;
}
memset 함수로 메모리에 값을 설정할 때는 포인터를 그대로 넣어줌. 왜냐하면 포인터는 안에 메모리 주소를 담고 있으므로 &를 사용하지 않아도 됨.
여기서도 printf 함수로 p1의 각 멤버를 출력해보면 모두 0이 나옴.
.보통 memset 함수는 구조체나 메모리를 0으로 초기화 할 때 사용하지만 각 상황에 따라서 0이 아닌 다른 값으로 초기화 할 때도 사용할 수 있음.
52.2 구조체와 메모리 복사하기
매번 내용이 같은 구조체를 만들려면 상당히 번거로움. 또는 이미 생성하여 값을 저장한 구조체나 메모리를 다른 곳에 복사할 경우가 자주 있음. 이때는 memcpy (memory copy) 함수를 사용하여 메모리의 내용을 다른 곳으로 복사할 수 있음. (string.h 헤더 파일)
-memcpy(목적지포인터, 원본포인터, 크기);
#include <stdio.h>
#include <string.h> //memset 함수가 선언된 파일
struct Point2D {
int x;
int y;
};
int main()
{
struct Point2D p1;
struct Point2D p2;
p1.x = 10;
p1.y = 20;
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;
}
malloc 함수로 할당한 동적 메모리끼리 복사하는 방법
#include <stdio.h>
#include <string.h> //memset 함수가 선언된 파일
#include <stdlib.h>
struct Point2D {
int x;
int y;
};
int main()
{
struct Point2D* p1 = malloc(sizeof(struct Point2D));
struct Point2D* p2 = malloc(sizeof(struct Point2D));
p1->x = 10;
p1->y = 20;
memcpy(p2, p1, sizeof(struct Point2D)); // Point2D 구조체 크기만큼 p1의 내용을 p2로 복사
printf("%d %d\n", p2->x, p2->y); //10 20: p1의 내용을 p2로 복사했으므로 10 20
free(p2);
free(p1);
return 0;
}
지금까지 구조체 변수에서 구조체 변수로, 동적 메모리에서 동적 메모리로 내용을 복사했지만 구조체 변수에서 동적 메모리로, 동적 메모리에서 구조체 변수로 내용 복사도 할 수 있음.
struct Point2D p1;
struct Point2D *p2 = malloc(sizeof(struct Point2D));
memcpy(p2, &p1, sizeof(struct Point2D)); // 구조체 변수에서 동적 메모리로 복사
struct Point2D *p1 = malloc(sizeof(struct Point2D));
struct Point2D p2;
memcpy(&p2, p1, sizeof(struct Point2D)); // 동적 메모리에서 구조체 변수로 복사
구조체는 포인터로 선언하고 메모리를 할당한 뒤 memset, memcpy 함수를 자주 사용하므로 눈에 익혀두는 것이 좋음.
'C > C언어 코딩도장' 카테고리의 다른 글
UNIT 54 공용체 사용하기 (0) | 2022.03.13 |
---|---|
UNIT 53 구조체 배열 사용하기 (0) | 2022.03.12 |
UNIT 51 구조체 멤버 정렬 사용하기 (0) | 2022.03.11 |
UNIT 50 두 점 사이의 거리 구하기 (0) | 2022.03.10 |
UNIT 49 구조체 포인터 사용하기 (0) | 2022.03.09 |