본문 바로가기

C

구조체포인터 선언 및 동적메모리할당

구조체 포인터 선언 및 동적 메모리 할당하는 코드

 

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