문타쿠, 공부하다.
[C언어 코딩 도장] Unit 52. 구조체와 메모리 활용하기 본문
INTRO
구조체에 변수를 선언하거나 메모리를 할당하며 결국 메모리 공간을 차지하게 되는 것이므로 메모리 관련 함수도 사용할 수 있게 된다.
이번에는 메모리 함수를 사용하여 구조체와 메모리에 값을 설정하는 방법과, 구조체와 메모리의 내용을 복사하는 방법을 알아보자.
52.1 구조체와 메모리 활용하기
구조체의 멤버를 모두 0으로 만들기 위한 방법1. 멤버별로 접근하여 0을 저장한다.
구조체변수.멤버1 = 0;
구조체변수.멤버2 = 0;
구조체변수.멤버3 = 0;
구조체변수.멤버4 = 0;
구조체변수.멤버5 = 0;
- 멤버의 수가 많아질수록 매우 번거로운 작업이 된다.
방법2. { 0, } 중괄호를 사용하여 0으로 초기화한다.
#include <stdio.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
// { 0, }을 사용하여 구조체 변수의 내용을 모두 0으로 초기화
struct Point2D p1 = { 0, };
printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
return 0;
}
- 구조체 변수에 손쉽게 사용 가능하지만, malloc() 함수로 할당한 메모리에는 사용할 수 없다는 특징이 있다.
방법 3.memset() 함수를 사용한다.(string.h 헤더 파일에 선언되어 있음)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
struct Point2D p2;
// memset() 함수를 사용하여 구조체 변수의 내용을 모두 0으로 초기화
memset(&p2, 0, sizeof(struct Point2D));
printf("p2.x = %d, p2.y = %d\n\n", p2.x, p2.y);
struct Point2D* p3 = malloc(sizeof(struct Point2D));
// malloc() 함수로 할당된 메모리인 p3에는 { 0, }를 사용할 수 없음
// memset() 함수를 사용하여 구조체 변수의 내용을 모두 0으로 초기화
memset(p3, 0, sizeof(struct Point2D));
printf("p3->x = %d, p3->y = %d\n", p3->x, p3->y);
free(p3);
return 0;
}
- memset() 함수는 주로 구조체나 메모리를 0으로 초기화할 때 사용한다.
52.2 구조체와 메모리 복사하기
내용이 같은 구조체를 만들거나, 이미 생성하여 값을 저장한 구조체나 메모리를 다른 곳에 복사할 때 사용하는 메모리 복사 함수 -> memcpy() 함수, string.h 헤더 파일에 선언되어 있음
#include <stdio.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
struct Point2D p1;
struct Point2D p2;
// p1의 멤버에만 값을 저장
p1.x = 10;
p1.y = 20;
// p2에 p1의 내용을 복사
memcpy(&p2, &p1, sizeof(struct Point2D));
printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
printf("p2.x = %d, p2.y = %d\n", p2.x, p2.y);
return 0;
}
malloc() 함수로 할당한 동적 메모리끼리 복사
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
struct Point2D* p1 = malloc(sizeof(struct Point2D));
struct Point2D* p2 = malloc(sizeof(struct Point2D));
// p1의 멤버에만 값을 저장
p1->x = 100;
p1->y = 200;
// p2에 p1의 내용을 복사
memcpy(p2, p1, sizeof(struct Point2D));
printf("p1->x = %d, p1->y = %d\n", p1->x, p1->y);
printf("p2->x = %d, p2->y = %d\n", p2->x, p2->y);
free(p1);
free(p2);
return 0;
}
구조체 변수에서 동적 메모리로, 동적 메모리에서 구조체 변수로도 내용 복사 가능
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
struct Point2D p1;
struct Point2D* p2 = malloc(sizeof(struct Point2D));
p1.x = 2023;
p1.y = 2024;
memcpy(p2, &p1, sizeof(struct Point2D));
printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
printf("p2->x = %d, p2->y = %d\n", p2->x, p2->y);
free(p2);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Point2D
{
int x;
int y;
};
int main(void)
{
struct Point2D p1;
struct Point2D* p2 = malloc(sizeof(struct Point2D));
p2->x = 2023;
p2->y = 2024;
memcpy(&p1, p2, sizeof(struct Point2D));
printf("p1.x = %d, p1.y = %d\n", p1.x, p1.y);
printf("p2->x = %d, p2->y = %d\n", p2->x, p2->y);
free(p2);
return 0;
}
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 53. 구조체 배열 사용하기 (1) | 2023.12.08 |
---|---|
[C언어 코딩 도장] Unit 52. 연습문제 및 심사문제 (0) | 2023.12.08 |
[C언어 코딩 도장] Unit 51. 연습문제 및 심사문제 (0) | 2023.10.29 |
[C언어 코딩 도장] Unit 51. 구조체 멤버 정렬 사용하기 (0) | 2023.10.29 |
[C언어 코딩 도장] Unit 50. 연습문제 및 심사문제 (0) | 2023.10.29 |