38.2 입력한 크기만큼 메모리를 할당하여 배열처럼 사용하기

이번에는 사용자가 입력한 크기만큼 메모리를 할당하여 배열처럼 사용해보겠습니다.

pointer_scanf_like_array.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일

int main()
{
    int size;

    scanf("%d", &size);

    int *numPtr = malloc(sizeof(int) * size);    // (int 크기 * 입력받은 크기)만큼 동적 메모리 할당

    for (int i = 0; i < size; i++)    // 입력받은 크기만큼 반복
    {
        numPtr[i] = i;                // 인덱스로 접근하여 값 할당
    }

    for (int i = 0; i < size; i++)    // 입력받은 크기만큼 반복
    {
        printf("%d\n", numPtr[i]);    // 인덱스로 접근하여 값 출력
    }

    free(numPtr);    // 동적으로 할당한 메모리 해제

    return 0;
}

소스를 컴파일하여 실행한 뒤 5를 입력하고 엔터 키를 누르세요.

실행 결과

5 (입력)
0
1
2
3
4
↑ 5를 입력했으므로 0부터 4까지 값이 들어갔음

scanf로 크기를 입력받았습니다. 그리고 int 크기에 입력받은 크기를 곱하여 메모리를 할당합니다.

scanf("%d", &size);

int *numPtr = malloc(sizeof(int) * size);    // (int 크기 * 입력받은 크기)만큼 동적 메모리 할당

메모리가 준비되었으면 입력받은 크기만큼 반복하면서 값을 할당하고, 다시 입력받은 크기만큼 반복하면서 값을 출력합니다. 배열과 마찬가지로 값을 할당하거나 출력할 때는 [ ]를 사용하여 인덱스로 접근하면 됩니다.

for (int i = 0; i < size; i++)    // 입력받은 크기만큼 반복
{
    numPtr[i] = i;                // 인덱스로 접근하여 값 할당
}

for (int i = 0; i < size; i++)    // 입력받은 크기만큼 반복
{
    printf("%d\n", numPtr[i]);    // 인덱스로 접근하여 값 출력
}

사용이 끝났으면 반드시 free 함수로 할당한 메모리를 해제합니다.

free(numPtr);    // 동적으로 할당한 메모리 해제

지금까지 포인터에 메모리를 할당하여 1차원 배열처럼 사용해보았습니다. 그럼 2차원 배열은 포인터로 어떻게 사용할 수 있을까요?