기초 - 동적 메모리 할당

임재현·2021년 4월 27일

C

목록 보기
10/10

패스트 캠퍼스 컴퓨터 공학 all in one 패키지. C

동적 메모리 할당

동적 메모리 할당의 개념

  1. 일반적으로 C언어에서 배열의 경우 사전에 적절한 크기만큼 할당해 주어야 한다.
  2. 우리가 원하는 만큼만 메모리를 할당해서 사용하고자 한다면 동적 메모리 할당을 사용한다.
    3.동적이라는 말의 의미는 '프로그램 실행도중에'라는 의미이다.

동적 메모리 할당 함수

  1. C언어에서는 malloc()함수를 이용해 원하는 만큼의 메모리 공간을 확보할 수 있다.
  2. malloc()함수는 메모리 할당에 성공하면 주소를 반환하고, 그렇지 않으면 NULL을 반환한다.
  3. malloc()함수는 <stdlib.h>라이브러리에 정의되어 있다.
  • 동적 메모리 할당을 수행할 때마다 할당되는 포인터의 주소는 변칙적이다. 우리 컴퓨터 메모리 상에서 남아있는 공간을 알아서 할당해주기 때문이다.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int *a = malloc(sizeof(int));   //sizeof(int)는 4바이트.
    // 할당에 성공했다면 성공된 값을 a라는 변수에 넣겠다는 의미. 할당에 실패하면 null값이 들어감.
    printf("%d\n",a);
    a = malloc(sizeof(int));
    printf("%d\n",a);    
    return 0;
}

결과

-1455400448
-1455400432
  • 동적으로 할당되는 함수는 <힙영역>에 저장된다.

동적 메모리 할당함수

  1. 전통적인 C언어에서는 스택에 선언된 변수는 따로 메모리 해제를 해주지 않아도 된다.
  2. 반면에 동적으로 할당된 변수는 반드시 free()함수로 메모리 해제를 해주어야 한다.
  3. 메모리 해제를 하지 않으면 메모리 내의 프로세스 무게가 더해져 언젠가는 오류가 발생한다.
  4. 메모리 누수(Memory Leak) 방지는 코어 개발자의 핵심 역량이다.
  • 할당한 메모리를 해제 한 뒤에 다시 할당
  • 이 경우 동일한 메모리 주소를 할당 받을 가능성이 높다.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const char * argv[]) {
    int *a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a);
    a = malloc(sizeof(int));
    printf("%d\n",a);
    free(a); 
    return 0;
}

결과

-2067768832
-2067768832

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

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


int main(int argc, const char * argv[]) {
    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");
    }
    return 0;
    // 일반적으로 프로그램이 종료되는 순간, 프로그램 안에 사용되었던 모든 내용들은 다
    // 메모리 해제가 이루어 지니깐, 이렇게 간단한 예제를 다룰 때에는 일일이 free()함수를 이용하지 않아도 된다.
    // 하지만 실제 상용프로그램을 개발하고자 할 때는, 항상 free()함수를 이용해 메모리 해제를 해주어야 한다. 
}

결과

0 1 2 
3 4 5 
6 7 8 
profile
임재현입니다.

0개의 댓글