초보 해커를 위한 C언어와 동작 원리/Ch2. Programming

동적 할당

anonkorea4869 2025. 4. 23. 00:38

학습 목표

! 내용은 검토 포스트 입니다. 부정확한 내용이 있을 있으니 양해바랍니다.

  • 동적할당 사용 이유와 방법 대해 이해한다.
  • 동적할당 원리에 대해 간단히 이해한다.

1. 동적 할당 사용 이유

고객 100명의 나이를 배열에 저장해야하면 아래와 같이 코드를 작성할 수 있을 것이다. 하지만 값(100)보다 사람이 적다면 저장 공간이 낭비될것이고, 사람이 더 많아진다면 값을 늘려 컴파일 해야할 것이다. 만약 상용 프로그램이였다면 코드가 크니 컴파일 시간도 오래 걸릴것이고 배포도 해야하니 문제가 있다. 따라서 입력한 값 만큼 배열의 크기를 정할 수 있는 동적할당을 사용한다.

#include <stdio.h>

int main(void) {
    int age[100];

    return 0;
}

2. malloc

동적할당을 할 수 있게 해주는 함수는 malloc(Memory Allocation) 함수이다. 함수는 stdlib.h 헤더파일에 있다.인자로 크기(정수)를 주면 크기만큼 공간을 마련하고 포인터를 반환한다. 알아두면 좋은 상식은 일반 변수들이 저장되는 공간과 다른 Heap이라는 영역에서 공간을 할당한다는 것이다.

void *malloc(size_t __size)

아래 코드는 40Byte만큼 공간을 마련하는 코드이다. 포인터를 반환받는것이므로 int * 선언한다. 주의해야할 점은 malloc 함수의 반환 데이터 타입은 void *로 직접 형변환(Type casting)을 해주여야 한다는 점이다. 또한 동적할당을 한 공간은 free함수를 사용하여 해제해야한다.

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

int main(void) {
    int *dynamic;

    dynamic = (int *)malloc(40);
    free(dynamic);
    return 0;
}

처음 예제인 고객 n명의 나이를 저장하는 코드는 아래와 같이 작성할 수 있다. 100명의 나이를 저장하기 위해서는 100 * 정수의 크기 만큼 공간을 마련해야 한다. int age[n]의 age도 포인터이고 *age도 포인터이니 동적할당으로 만들어진 변수도 int age[n]한것과 같이 사용할 수 있다.

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

int main(void) {
    int num;
    int *age;

    scanf("%d", &num); // 입력 : 100

    age = (int *)malloc(num * sizeof(int)); // 고객 수 * 정수의 크기

        age[0] = 13;

    free(age);

    return 0;
}

3. 동적할당의 원리

아래 코드의 경우 10Byte의 동적할당 한 후 free로 메모리에 반환하고 또 10Byte의 동적할당을 하였을 때 두 주소가 같다는것을 확인 할 수 있다. 이는 동적 할당의 주소가 랜덤으로 이루어지는것이 아닌 순서대로 사용한 다는 것을 알 수 있다.

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

int main(void) {
    int *dynamic1, *dynamic2;

    dynamic1 = (int *)malloc(10); // 0x600000510030
    printf("%p\n", dynamic1);

    free(dynamic1);

    dynamic2 = (int *)malloc(11); // 0x600000510030
    printf("%p\n", dynamic2);

    free(dynamic2);

    return 0;
}

동적할당은 인자로 들어오는 할당할 크기를 특정 크기로 분류하여 서로 다른 저장 공간을 사용한다. 만약 크기의 차이가 큰 두 동적할당 변수를 선언 하였을 때 단순히 주소가 다를 뿐만 아니라 다른 범위의 메모리 공간을 사용한다는것을 알 수 있다.

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

int main(void) {
    int *dynamic1, *dynamic2, *dynamic3;

    dynamic1 = (int *)malloc(10); // 0x600002edc030
    printf("%p\n", dynamic1);

    dynamic2 = (int *)malloc(12); // 0x600002edc040
    printf("%p\n", dynamic2);

    free(dynamic2);

    dynamic3 = (int *)malloc(1000); // 0x12fe04840
    printf("%p\n", dynamic3);

    free(dynamic3);

    return 0;
}

'초보 해커를 위한 C언어와 동작 원리 > Ch2. Programming' 카테고리의 다른 글

구조체  (0) 2025.04.23
문자열 함수  (0) 2025.04.23
함수  (0) 2025.04.23
배열과 포인터  (2) 2025.04.22
포인터  (0) 2025.04.22