[C언어] 동적 메모리 할당

0

C언어

목록 보기
6/7
post-custom-banner


동적 메모리 할당

  • 동적 메모리 할당이란 프로그램이 실행 도중에 동적으로 메모리 할당 받는 것
  • '동적' 이라는 말은 딱 정해진 것이 아니라 가변적으로 변할 수 있다는 것.
    또한 메모리를 '할당' 한다는 것은 우리가 배열을 정의하면 배열에 맞는 메모리의 특정한 공간이 배열을 나타내는 것처럼 메모리의 특정한 부분을 사용할 수 있게 됩니다.
  • 프로그램에서는 필요한 만큼의 메모리를 시스템으로부터 할당을 받아서 사용하고, 사용이 끝나면 시스템에 메모리를 반납합니다. 필요한 만큼만 할당을 받고 또 필요한 때에 사용하고 반납하여 메모리를 효율적으로 사용할 수 있는 것입니다. 동적 메모리는 malloc() 계열의 라이브러리 함수를 사용하여 할당받아 사용할 수 있습니다.
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int *pi; // pointer integer
    pi = (int *)malloc(sizeof(int));
    // malloc = 메모리를 할당해라. (4만큼)
    if (pi==NULL){
        printf("동적 메모리 할당에 실패했습니다.\n");
        exit(1);
    }
    *pi = 100;
    printf("%d\n",*pi);
    //동적 메모리 사용한 이후에는 무조건 해당메모리 반환
    free(pi); 
    return 0;
    
    //실행결과
    // 100
}

malloc = memory allocation
이 함수는 인자로 전달된 크기의 바이트 수만큼 메모리 공간을 만듭니다. 이 함수가 리턴하는 것은 자신이 할당한 메모리의 시작 주소를 리턴하게 됩니다. 이 때, 리턴형이 (void*) 형이므로 우리는 이를 (int*) 형으로 형변환 하여 pi에 넣어주기만 하면된다.

그리고 마지막에 free는 우리가 할당받은 메모리를 다 쓰고 난 후에 메모리 영역을 다시 컴퓨터에게 돌려주는 역할을 합니다.


동적메모리로 100바이트를 할당받아 알파벳 출력하기

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

int main(void)
{
    char *pc = NULL;
    int i = 0;
    //100개의 문자를 저장하기 위한 공간 생성
    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을 의미합니다.
    // 문자배열 마지막에 0을 넣어서 마무리
    *(pc + i) = 0;
    printf("%s\n",pc);
    free(pc);//메모리해제
    return 0;
}

동적 메모리로 정수 5개를 처리

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

메모리 해제는 선택이 아닌 필수다. 실무에서는 메모리를 자주, 많이 할당하기 때문에 메모리를 할당만 하고 해제를 해주지 않으면 결국에는 시스템의메모리가 부족해지므로 운영체제가 프로그램을 강제로 종료시키거나 메모리 할당에 실패하게 됩니다. 특히 메모리를 해제 하지 않아 사용량이 계속 증가하는 현상을 메모리 누수(memory leak)라 부릅니다.


포인터 배열을 이용해 2차원 배열 할당하기

/* 2 차원 배열의 동적 할당 */
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  int i;
  int x, y;
  int **arr;  // 우리는 arr[x][y] 를 만들 것이다.

  printf("arr[x][y] 를 만들 것입니다.\n");
  scanf("%d %d", &x, &y);

  arr = (int **)malloc(sizeof(int *) * x);
  // int* 형의 원소를 x 개 가지는 1 차원 배열 생성

  for (i = 0; i < x; i++) {
    arr[i] = (int *)malloc(sizeof(int) * y);
  }

  printf("생성 완료! \n");

  for (i = 0; i < x; i++) {
    free(arr[i]);
  }
  free(arr);

  return 0;
}

참고자료1, 참고자료2, 참고자료3

post-custom-banner

0개의 댓글