티스토리 뷰

Programing/C++

C++ 구조체, 구조체 포인터

live2skull 2016. 7. 31. 18:37

구조체

#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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함