구조체 포인터 선언 및 동적 메모리 할당하는 코드
다른 자료형과 마찬가지로 구조체도 포인터를 선언할 수 있으며 구조체 포인터에는 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 대신 변수를 넣으면 에러가 발생한다. 배열 선언문의 크기값은 상수만 가능하기 때문이다.