본문 바로가기

컴퓨터 기본 개념

15강. 동적메모리할당

<동적 메모리 할당 개념>

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

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

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

 

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

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

 

<동적 메모리 할당 함수>

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

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

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

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

 

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

int main(void){
    int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
    printf("%d\n", a);
    a = malloc(sizeof(int));
    printf("%d\n", a);
    system("pause");
    return 0;
}

//출력값 두개 다 같게 나왔음, 하지만 매번 실행 할 때마다 다른 주소값이 할당 될 수 있으므로 변칙적이다.

 

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

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

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

- 메모리 누수(Memory Leak) 방지는 코어개발가의 핵심 역량이다.

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

int main(void){
    int *a = malloc(sizeof(int)); //int는 4바이트기 때문에 malloc(4)와 같다.
    printf("%d\n", a);
    free(a); //메모리 할당 해재해줌
    a = malloc(sizeof(int));
    printf("%d\n", a);
    free(a);//메모리 할당 해재해줌
    system("pause");
    return 0;
}
// 메모리 할당을 해제해줬기 때문에 웬만하면 두 print문에서 동일한 주소값이 출력될 것이다.
// 왜냐하면 첫번째 a는 할당 해제 뒤 메모리가 비어있고 바로 다음 줄에서 메모리 할당을 해줄 확률이 높기 때문이다.

 

 

<동적 문자열 처리하기>

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

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

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

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

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

int main(void){
    char *a = malloc(100); //100바이트 할당
    memset(a, 'A', 100);
    for(int i=0; i<100; i+){
        printf("%c",a[i]);
    }
    system("pause");
    return 0;
}
// A가 100개 출력된다.

 

 

- 동적 메모리 할당의 예제

#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(suzeof(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;
}
// 0 1 2
// 3 4 5
// 6 7 8
// 형태로 출력된다.