동적 할당

Jaemyeong Lee·2024년 6월 7일

C/C++

목록 보기
39/56

GPT

C/C++에서 동적 할당(Dynamic Memory Allocation)에 대해 설명하고, 이를 이해하기 위한 다양한 방식을 제공하겠습니다.

1. 동적 할당 개요

동적 할당은 프로그램이 실행되는 동안 메모리를 할당하는 것을 의미합니다. 이는 주로 힙(Heap) 메모리 영역에서 이루어지며, 필요한 크기의 메모리를 할당하고 더 이상 필요하지 않을 때 해제하여 메모리 누수를 방지할 수 있습니다. C에서는 malloc, calloc, reallocfree 함수를 사용하고, C++에서는 newdelete 연산자를 사용합니다.

2. 동적 할당 함수와 연산자

C에서의 동적 할당

  • malloc: 지정된 바이트 수만큼 메모리를 할당합니다.
  • calloc: 지정된 수의 요소에 대해 초기화된 메모리를 할당합니다.
  • realloc: 기존에 할당된 메모리 크기를 조정합니다.
  • free: 할당된 메모리를 해제합니다.
#include <stdio.h>
#include <stdlib.h>

int main() {
    int *ptr;
    int n, i;

    n = 5;
    // malloc을 사용한 메모리 할당
    ptr = (int*)malloc(n * sizeof(int));
    if (ptr == NULL) {
        printf("Memory not allocated.\n");
        return 1;
    }

    // 할당된 메모리에 값 초기화
    for (i = 0; i < n; ++i) {
        ptr[i] = i + 1;
    }

    // 할당된 메모리의 값 출력
    printf("The elements of the array are: ");
    for (i = 0; i < n; ++i) {
        printf("%d ", ptr[i]);
    }
    printf("\n");

    // 메모리 해제
    free(ptr);

    return 0;
}

C++에서의 동적 할당

  • new: 지정된 타입의 메모리를 할당하고, 선택적으로 초기화합니다.
  • delete: 할당된 메모리를 해제합니다.
  • new[]: 배열 메모리를 할당합니다.
  • delete[]: 배열 메모리를 해제합니다.
#include <iostream>

int main() {
    int* ptr;
    int n = 5;

    // new를 사용한 메모리 할당
    ptr = new int[n];

    // 할당된 메모리에 값 초기화
    for (int i = 0; i < n; ++i) {
        ptr[i] = i + 1;
    }

    // 할당된 메모리의 값 출력
    std::cout << "The elements of the array are: ";
    for (int i = 0; i < n; ++i) {
        std::cout << ptr[i] << " ";
    }
    std::cout << std::endl;

    // 메모리 해제
    delete[] ptr;

    return 0;
}

3. 컴퓨터 구조 및 운영체제 측면에서의 이해

메모리 할당

동적 할당은 힙 메모리에서 이루어집니다. 힙은 프로그램 실행 중에 동적으로 메모리를 할당하고 해제할 수 있는 메모리 영역입니다. 운영체제는 프로그램이 요청하는 메모리를 할당하고, 해제된 메모리를 다시 사용할 수 있도록 관리합니다.

메모리 구조:
+------------------+
|   코드 세그먼트   |
+------------------+
|   데이터 세그먼트 |
|  (전역 및 정적 변수)|
+------------------+
|   힙 세그먼트     |
| (동적 할당 메모리) |
+------------------+
|   스택 세그먼트   |
|  (지역 변수 및 함수 호출)|
+------------------+

메모리 접근

동적 할당된 메모리는 포인터를 통해 접근할 수 있습니다. 포인터는 힙에 할당된 메모리 블록의 시작 주소를 저장하고, 이를 통해 메모리 블록 내의 데이터를 읽거나 쓸 수 있습니다.

4. 그림과 삽화

동적 할당의 메모리 구조와 포인터 사용 방식을 이해하기 쉽게 그림과 표로 표현하였습니다.

동적 메모리 할당:
int* ptr = (int*)malloc(n * sizeof(int)); // C
int* ptr = new int[n]; // C++

힙 메모리 구조:
+----------------------+
|        ...           |
+----------------------+
| ptr -> [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ]
+----------------------+
|        ...           |
+----------------------+

포인터 사용:
ptr[0] -> 1
ptr[1] -> 2
ptr[2] -> 3
ptr[3] -> 4
ptr[4] -> 5

5. 예제 코드 확장

다양한 상황에서 동적 할당을 사용하는 예제를 추가로 제공합니다.

동적 2차원 배열 할당

C에서의 동적 2차원 배열 할당
#include <stdio.h>
#include <stdlib.h>

int main() {
    int rows = 3, cols = 4;
    int** arr = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; ++i) {
        arr[i] = (int*)malloc(cols * sizeof(int));
    }

    // 2차원 배열 초기화
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            arr[i][j] = i * cols + j + 1;
        }
    }

    // 2차원 배열 출력
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    // 메모리 해제
    for (int i = 0; i < rows; ++i) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}
C++에서의 동적 2차원 배열 할당
#include <iostream>

int main() {
    int rows = 3, cols = 4;
    int** arr = new int*[rows];
    for (int i = 0; i < rows; ++i) {
        arr[i] = new int[cols];
    }

    // 2차원 배열 초기화
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            arr[i][j] = i * cols + j + 1;
        }
    }

    // 2차원 배열 출력
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            std::cout << arr[i][j] << " ";
        }
        std::cout << std::endl;
    }

    // 메모리 해제
    for (int i = 0; i < rows; ++i) {
        delete[] arr[i];
    }
    delete[] arr;

    return 0;
}

요약

동적 할당은 프로그램이 실행되는 동안 메모리를 할당하고 해제하는 방법입니다. 이는 주로 힙 메모리에서 이루어지며, C에서는 malloc, calloc, realloc, free 함수를 사용하고, C++에서는 newdelete 연산자를 사용합니다. 동적 할당을 통해 배열이나 구조체와 같은 데이터 구조를 효율적으로 관리할 수 있습니다. 운영체제는 동적 할당된 메모리의 할당과 해제를 관리하여 프로그램이 효율적으로 실행될 수 있도록 돕습니다.

이와 같은 내용을 통해 C/C++의 동적 할당에 대해 더 깊이 이해할 수 있을 것입니다. 추가로 궁금한 사항이 있으면 알려주세요!

profile
李家네_공부방

0개의 댓글