티스토리 뷰
구조체
#include "stdafx.h"
#include "malloc.h"
typedef struct struct_typedef
{
int power;
int age;
}
struct struct_default
{
int power;
int age;
}
int main(int argc, char *argv[], char* envp)
{
struct struct_default struct01;
struct_typedef struct02;
}
! 구조체는 "typedef struct NAME" 또는 "struct NAME" 으로 선언할 수 있다.
다만 첫번째 방법으로 선언했을 때는 바로 이름을 변수처럼 이용해 변수를 만들 수 있으나,
두번째 방법으로 선언했을 때는 변수 타입 앞에 struct를 붙여 주어야 한다.
구조체 - Assembly
#include "stdafx.h"
#include "malloc.h"
#include "memory.h"
#include "string.h"
typedef struct myinfo
{
char* ptr_char;
int a;
};
void testFunc(myinfo arg)
{
printf("%d\n", arg.a);
printf("%s\n", arg.ptr_char);
}
int main(int argc, char *argv[], char* envp)
{
myinfo Myinfo;
Myinfo.ptr_char = (char *)malloc(100);
memset(Myinfo.ptr_char,0, 100);
strcpy(Myinfo.ptr_char, "mystring1234");
testFunc(Myinfo);
// printf("%s\n", Myinfo.ptr_char);
}
!! 구조체를 call by value 할 경우, 사용되는 구조체의 값들만 스택에 push 된다. (인자로 전달)
구조체의 전체 데이터가 다 전달되는 것이 아니라, 해당 함수에서 참조된 값들만 전달됨. (handray에서 나중에 다시 자세히 다룸)
구조체 - 포인터 / 다중 포인터(배열)
#include "stdafx.h"
#include "malloc.h"
#include "memory.h"
#include "string.h"
typedef struct myinfo
{
char* ptr_char;
int a;
};
void testFunc(myinfo *arg)
{
printf("%d\n", arg->a);
printf("%s\n", arg->ptr_char);
}
int main(int argc, char *argv[], char* envp)
{
myinfo *info = (myinfo *)malloc(sizeof(myinfo));
info->a = 99;
info->ptr_char = (char *)malloc(100);
strcpy(info->ptr_char, "mystring1234");
testFunc(info);
// array - stack
myinfo a, b;
myinfo *infoList[] = {&a, &b};
infoList[1]->a = 3;
infoList[1]->ptr_char = (char *)malloc(100);
strcpy(infoList[1]->ptr_char, "mystring5678");
testFunc(infoList[1]);
// array - heap
int size = 20;
myinfo **heap = (myinfo **)malloc(size * sizeof(myinfo));
heap[0] = (myinfo *)malloc(sizeof(myinfo));
heap[0]->a = 50;
heap[0]->ptr_char = (char *)malloc(100);
strcpy(heap[0]->ptr_char, "mystring9012");
testFunc(heap[0]);
}
! 구조체의 포인터를 이용해 값에 액세스할 경우, -> 를 이용한다.
스택을 사용할 경우 배열의 크기를 바꿀 수 없다.
선언할 때는 *name[] = {&struct_name}과 같은 형태로 선언한다.
힙을 사용할 경우 배열의 크기를 바꿀 수 있다.
갯수 * sizeof(mystruct)와 같은 형태로 malloc하여 원하는 크기의 포인터 메모리를 할당받는다.
주의할 점은 힙에 저장한 포인터 배열이므로, list[0] 과 같이 사용할 경우 이 공간에도 malloc을 이용해 구조체 크기만큼의 메모리를 할당해야 사용이 가능하다.
그림 설명.
'Programing > C++' 카테고리의 다른 글
C++ Assert를 이용한 프로그램 디버깅 (0) | 2016.08.02 |
---|---|
C++ 함수 오버로딩, 오버라이딩 (0) | 2016.08.01 |
C++ 다중, 더블 포인터 (0) | 2016.07.29 |
C++ 메모리 할당, 포인터 (문자열) (0) | 2016.07.28 |
C++ 데이터 형 (0) | 2016.07.23 |
댓글