동적 메모리 할당의 개념

일반적으로  C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해주어야 합니다.

원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적메모리 할당을 사용합니다

동적이라는 말의 의미는 '프로그램 실행 도중에' 라는 의미입니다

 

C언어에서는 malloc() 함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있습니다

malloc()함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환합니다

또한 malloc()함수는 <stdlib.h>라이브러리에 정의 되어있습니다

 

malloc(할당할 바이트 크기);

동적 메모리 기초 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <stdlib.h>
//동적 메모리 기초 예제
int main(void) {
    int* pi;//Pointer Integer
    pi = (int*)malloc(sizeof(int));//malloc == 메모리를 할당해라 //sizeof(int) == sizeof(4)
    if (pi == NULL) {
        printf("동적 메모리 할당에 실패했습니다\n");
        exit(1);
    }
    *pi = 100;
    printf("%d\n"*pi);
    //동적 메모리 상용한 이후에는 무조건 해당 메모리를 반환합니다
    free(pi);
    return 0;
}
cs

 

동적메모리 할당을 활용해 a~z까지 출력하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    char* pc = NULL;
    int i = 0;
    pc = (char*)malloc(100 * sizeof(char));
    if (pc == NULL) {
        printf("동적 메모리 할당에 실패했습니다\n");
        exit(1);
    }
    //pc가 가르키는 포인터를 1씩 증가시키며 알파벳 소문자를 삽입합니다
    for (i = 0; i < 26; i++) {
        *(pc + i) = 'a' + i;
    }
    //아스키코드에서 0은 NULL을 의미합니다
    *(pc + i) = 0;
 
    printf("%s\n", pc);
    free(pc);
    return 0;
}
cs

 

동적 메모리로 정수 5개 처리하는 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int* pi, i;
    pi = (int*)malloc(5 * sizeof(int));
    if (pi == NULL) {
        printf("동적 메모리 할당에 실패했습니다\n");
        exit(1);
 
    }
    pi[0= 100;
    pi[1= 200;
    pi[2= 300;
    pi[3= 400;
    pi[4= 500;
    for (i = 0; i < 5; i++) {
        printf("%d\n"*(pi + i));
    }
    free(pi);
    return 0;
}
cs

 

 

 

 

동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적입니다

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int* a = malloc(sizeof(int));
    printf("%d\n", a);
    a = malloc(sizeof(int));
    printf("%d\n", a);
    system("pause");
    return 0;
}
cs

위와 같이 코드를 작성하게 되면 실행할때 마다 다른 주소값을 가진다는 것을 알 수 있습니다

동적으로 할당된 변수는 <힙 영역>에 저장됩니다

전통적인 C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지 않아도 됩니다

반면에 동적으로 할당된 변수는 반드시 free() 함수로 메모리 해제를 해주어야 합니다

만약 하지않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생합니다

 

 

free() 함수를 활용한 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
 
int main(void){
    int* a = malloc(sizeof(int));
    printf("%d\n", a);
    free(a);
    a = malloc(sizeof(int));
    printf("%d\n", a);
    free(a);
    system("pause");
    return 0;
}
cs

 

free()함수를 활용해 메모리 해제를 해주었기 때문에 printf("%d\n",a); 로 출력되는 주소의 값이

100%에 가까운 확률로 동일한 주소 값을 가집니다

 

 

구조체 동적 메모리 할당 예시

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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//구조체 동적메모리 할당
 
struct Book {
    int number;
    char title[100];
};
 
void showBook(struct Book* p, int n) {
    int i;
    for (i = 0; i < n; i++) {
        printf("번호 %d : %s\n", (p + i)->number, (p + i)->title);
    }
}
 
int main(void) {
    struct Book* p;
    p = (struct Book*)malloc(2 * sizeof(struct Book));
    if (p == NULL) {
        printf("동적 메모리할당에 실패했습니다\n");
        exit(1);
    }
 
    p->number = 1;
    strcpy(p->title, "C Programming");
 
    (p + 1)->number = 2;
    strcpy((p + 1)->title, "Data Structure");
 
    showBook(p, 2);
    free(p);
    return 0;
}
cs

 

 

 

동적으로 문자열 처리하기

memset(포인터,값,크기);

한 바이트 씩 값을 저장하므로 문자열 배열의 처리 방식과 흡사합니다.

따라서 memset()함수는 <sting.h>라이브러리에 선언되어 있습니다

 

memset() 함수를 이용한 예시

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void){
    char* a = malloc(100);
    memset(a, 'A'100);
    for (int i = 0; i < 100; i++) {
        printf("%c", a[i]);
    }
    system("pause");
    return 0;
}
cs

 

 

동적 메모리 할당의 예제

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
#include <stdlib.h>
 
int main(void) {
    int** p = (int**)malloc(sizeof(int** 3);
    for (int i = 0; i < 3; i++) {
        *(p + i) = (int)malloc(sizeof(int* 3);
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            *(*(p + i) + j) = i * 3 + j;
        }
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            printf("%d "*(*(p + i) + j));
        }
        printf("\n");
    }
    system("pause");
    return 0;
}
cs

동적 메모리 할당의 예시 2

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
#include <stdio.h>
 
int main(void) {
    int i, x, y;
    int** pptr = (int**)malloc(sizeof(int** 8);
    for (i = 0; i < 8; i++) {
        *(pptr + i) = (int*)malloc(sizeof(int** 6);
    }
 
    for (y = 0; y < 8; y++) {
        for (x = 0;x < 6; x++) {
            *(*(pptr + y) + x) = 6 * y + x;
        }
    }
    for (y = 0; y < 8; y++) {
        for (x = 0; x < 6; x++) {
            printf("%3d"*(*(pptr + y) + x));
        }
        printf("\n");
    }
 
    for (y = 0; y < 8; y++) {
        free(*(pptr + y));
    }
    return 0;
}
cs

'C' 카테고리의 다른 글

구조체  (0) 2021.02.13
함수 포인터  (0) 2021.02.13
다차원 배열과 포인터 배열  (0) 2021.02.10
C언어에서 변수를 처리하는 방법  (0) 2021.02.10
문자열  (0) 2021.02.08

+ Recent posts