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