동적 메모리 할당

C언어 2020. 12. 8. 16:33

동적 메모리 할당의 개념

1.

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

- 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적 메모리 할당을 사용함

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

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

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

- malloc( ) 함수는 <stdlib.h> 라이브러리에 정의되어 있음

 

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

 

2.

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

#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;
}

 

동적 메모리 할당 함수

1.

- 동적으로 할당된 변수는 <힙 영역>에 저장됨

 

코드 영역 - 소스코드

데이터 영역 - 전역 변수, 정적 변수

힙 영역 - 동적 할당 변수

스택 영역 - 지역 변수, 매개변수

 

2.

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

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

- 메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생함

- 메모리 누수(Memory Leak) 방지는 코어 개발자의 핵심 역량임

- 할당한 메모리를 해제한 뒤에 다시 할당받아 사용한 경우 동일한 메모리 주소를 할당받을 확률이 높음

#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;
}

 

동적으로 문자열 처리하기

- 일괄적인 범위의 메모리를 모두 특정한 값으로 설정하기 위해서는 memset( )을 사용함

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

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

- 따라서 memset( ) 함수는 <string.h> 라이브러리에 선언되어 있음

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char *a = malloc(100);
    memset(a, 'A', 100); // 65라는 아스키 코드로 100개의 만큼 채움
    for (int i = 0; i < 100; i++) {
        printf("%c", a[i]);
    }
    system("pause");
    return 0;
}

 

* 동적 메모리 할당의 다양한 예제

#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); // 3 x 3의 2차원 배열
    }
    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;
}

 

 

- 동적 메모리 할당을 이용해 프로그램이 실행 중인 도중에 메모리 공간을 배정받을 수 있음

- 동적으로 할당받은 프로그램은 반드시 명시적으로 free( ) 함수를 이용해 할당 해제를 해야만 함

'C언어' 카테고리의 다른 글

구조체  (0) 2020.12.08
함수 포인터  (0) 2020.12.08
다차원 배열과 포인터 배열  (0) 2020.12.07
컴퓨터가 변수를 처리하는 방법  (0) 2020.12.07
문자열  (0) 2020.12.05
Posted by khon98
,