C
구조체포인터 선언 및 동적메모리할당
jjwdl
2020. 10. 17. 16:35
구조체 포인터 선언 및 동적 메모리 할당하는 코드
다른 자료형과 마찬가지로 구조체도 포인터를 선언할 수 있으며 구조체 포인터에는 malloc 함수를 사용하여 동적 메모리를 할당할 수 있다.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
#define _CRT_SECURE_NO_WARNINGS // strcpy보안경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h> // strcpy 함수가 선언된 헤더파일
#include <stdlib.h> // malloc,free 함수가 선언된 헤더파일
struct Data{
char c1;
int *numPtr;
};
int again()
{
int num1 = 10;
struct Data d1;
struct Data *d2 = malloc(sizeof(struct Data));
d1.numPtr = &num1;
d2->numPtr = &num1;
printf("%d\n", *d1.numPtr);
printf("%d\n", *d2->numPtr);
d2->c1 = 'a';
printf("%c\n", (*d2).c1);
printf("%d,\n", *(*d2).numPtr);
free(d2);
return 0;
}
struct Person {
char name[20];
int age;
char address[100];
};
int main(){
struct Person *p1 = malloc(sizeof(struct Person)); //구조체 포인터선언 및 메모리할당
strcpy(p1->name, "홍길동"); //구조체의 포인터를 통해 멤버에 접근할 때는 ->를 이용한다.
p1->age = 30;
strcpy(p1->address, "서울시 용산구 한남동");
printf("이름: %s\n", p1->name);
printf("나이: %d\n", p1->age);
printf("주소: %s\n", p1->address);
printf("%d\n",(*p1).age); //역참조 & dot notation으로 멤버접근
free(p1); //동적 메모리 해제
again();
return 0;
}
|
cs |
동적메모리할당
프로그램을 작성할 때 미리 메모리를 할당해주는 정적할당과 달리 동적할당은 실행 중에 필요한 만큼 메모리를 할당하는 것이다. 우리는 메모리를 얼만큼 할당해야할지 모를 때 또는 임시적인 메모리가 필요할 때 동적 메모리 할당을 이용하여 메모리의 낭비를 막을 수 있다. 필요한 만큼 메모리를 할당하고 다 쓰면 재사용가능하도록 버리면 된다.
* 추가:
1. 메모리의 실체는 RAM이다.
2. 메모리 관리는 응용프로그램이 할 수 없으며 운영체제가 직접한다. 운영체제는 메모리가 남아있는 한 할당 요청을 거절하지 않고, 우선적으로 해제하지 않으면 절대 빈공간으로 인식하거나 재할당하지 않는다.
3. char a[30]; 에서 30 대신 변수를 넣으면 에러가 발생한다. 배열 선언문의 크기값은 상수만 가능하기 때문이다.