본문 바로가기

C언어/강의

2010년 11월 29일 월요일 구조체 사용자정의 (struct) & 구조체 초기화

#define 
\test 1 ☜ test 앞에 역슬러시(\)를 붙일경우 #define 하고 연결이 되서 #define test 1 하고 똑같이 취급된다.
역슬러시(\)를 안붙일경우는 #define 따로 test 1 따로 이므로 문법에 맞지 안다.
구조체 사용자 정의 (struct)

 위의 그림의 3가지 문법 모두 동일하다. 첫번째 문법은 구조체를 선언할때마다 struct을 붙여 줘야하지만 두번째 세번째 문법에서는 struct을 쓰지 않는 것을 볼수 있을 것이다. 
구조체의 초기화
#include <stdio.h>

typedef struct _memset
{
int iAddr;
char cChara;
int iSize;
}MEMSET;

void my_memset(void *, unsigned char, int);

void printmem(MEMSET *);

int main()
{
MEMSET A = {0, };
my_memset(&A,0,sizeof(A));
printmem(&A);
return 0;
}

void printmem(MEMSET *stData)
{
printf("A.iAddress : %d\n",stData->iAddr);
printf("A.cChara   : %d\n",stData->cChara);
printf("A.iSize    : %d\n",stData->iSize);
return;
}

void my_memset(void *Addr, unsigned char ucChara, int iSize)
{
while(iSize>0)
{
--iSize;
*((unsigned char *)Addr+iSize) = ucChara;
}
return;
}
위의 소스에서 MEMSET A = {0, }; 을 해주면 A구조체 안의 변수 iAddr, cChara, iSize가 모두 0으로 초기화가 된다. 마찮가지로 my_memset함수를 호출하여도 A의 구조체의 변수가 모두 초기화 되는 것을 볼수 있을 것이다.
 참고) void * 형은 어떠한 형태로든 초기화 할수 있기 때문에 int나 char처럼 크기가 정해져 있지 않다. 때문에 반드시 캐스팅을 해서 타입형을 맞춰주어야한다. 
string.h 파일안에 bzero와 memset 이있어 굳이 저렇게 만들어 쓰지 않아도 됨. 저렇다는걸 알아보기위함.