구조체 변수를 선언할 때 {0,}처럼 {}를 사용하여 0으로 초기화할 수 있지만, 변수에만 사용할 수 있고 malloc 함수로 할당한 메모리에는 사용할 수 없다.
struct구조체이름변수이름={0,};// 구조체 변수의 내용을 모두 0으로 초기화// 단 malloc 함수로 할당한 메모리에는 사용할 수 없음
일일이 멤버에 값을 설정하거나 {}를 사용하지 않고, 구조체 변수나 메모리의 내용을 한꺼번에 값을 설정하려면 memset 함수를 사용하면 된다.
memset(구조체포인터,설정할값,sizeof(struct구조체));
#include<stdio.h>#include<string.h> // memset 함수가 선언된 헤더 파일structPoint2D{intx;inty;};intmain(){structPoint2Dp1;memset(&p1,0,sizeof(structPoint2D));// p1을 구조체 크기만큼 0으로 설정printf("%d %d\n",p1.x,p1.y);// memset을 사용하여 0으로 설정했으므로 x, y 모두 0return0;}// 0 0
memset 함수로 구조체 변수의 값을 설정할 때는 &p1과 같이 주소 연산자 &를 사용하여 변수의 메모리 주소를 구해서 넣어준다.
그리고 설정할 값과 크기를 넣어준다.
여기서는 구조체의 내용을 모두 0으로 설정했고, Point2D 구조체 크기만큼 값을 설정했다.
memset(&p1,0,sizeof(structPoint2D));// p1을 구조체 크기만큼 0으로 설정
printf 함수로 p1의 각 멤버를 출력해 보면 모두 0이 나온다.
이번에는 malloc 함수로 할당한 동적 메모리에 값을 설정해 보자.
#include<stdio.h>#include<stdlib.h> // malloc, free 함수가 선언된 헤더 파일#include<string.h> // memset 함수가 선언된 헤더 파일structPoint2D{intx;inty;};intmain(){structPoint2D*p1=malloc(sizeof(structPoint2D));// 구조체 크기만큼 메모리 할당memset(p1,0,sizeof(structPoint2D));// p1을 구조체 크기만큼 0으로 설정printf("%d %d\n",p1->x,p1->y);// memset을 사용하여 0으로 설정했으므로 x, y 모두 0free(p1);// 동적 메모리 해제return0;}// 0 0
memset 함수로 메모리에 값을 설정할 때는 포인터를 그대로 넣어준다.
왜냐하면 포인터 안에는 메모리 주소가 있으므로 &를 사용하지 않아도 된다.
마찬가지로 설정할 값과 크기를 넣어준다.
memset(p1,0,sizeof(structPoint2D));// p1을 구조체 크기만큼 0으로 설정
여기서도 printf 함수로 p1의 각 멤버를 출력해 보면 모두 0이 나온다.
보통 memset 함수는 구조체나 메모리를 0으로 초기화할 때 사용하지만 각 상황에 따라서 0이 아닌 다른 값으로 초기화할 때도 사용할 수 있다.
4. 구조체와 메모리 복사하기
매번 내용이 같은 구조체를 만들려면 상당히 번거롭다.
string.h 헤더 파일에 선언되어 있는 memcpy 함수를 사용하면 메모리의 내용을 다른 곳으로 복사할 수 있다.