Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[C언어 코딩 도장] Unit 38. 포인터와 배열 응용하기 본문

C언어/C언어 코딩 도장

[C언어 코딩 도장] Unit 38. 포인터와 배열 응용하기

개발새발 문타쿠 2023. 9. 23. 22:25

INTRO

지금까지 크기가 고정된 배열을 사용했다.

int numArr[10];

 

이번에는 포인터에 메모리를 할당하여 배열처럼 사용해보자.

#include <stdio.h>

int main(void)
{
    int size;

    scanf_s("%d", &size);

    int numArr[size];

    return 0;
}

하지만 위와 같이 프로그램 실행 중에 원하는 크기만큼 배열을 생성하는 기능(가변 길이 배열)은 GCC에서는 지원하지만, 내가 사용 중인 Visual Studio 2022에서는 지원하지 않아 컴파일 에러가 발생한다.

 

그럼 배열의 크기를 동적으로 할당하려면 어떻게 해야할까?

-> 크기를 동적으로 지정하려면 포인터를 선언하고 메모리를 할당한 뒤 메모리를 배열처럼 사용해야한다.


38.1 포인터에 할당된 메모리를 배열처럼 사용하기

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

int main(void)
{
    // int 10개 크기만큼 동적 메모리 할당
    int* numPtr = malloc(sizeof(int) * 10);

    // 배열처럼 인덱스로 접근하여 값 할당 = *numPtr처럼 포인터를 역참조한 것
    numPtr[0] = 10;
    numPtr[9] = 20;

    printf("%d\n", numPtr[0]);
    printf("%d\n", numPtr[9]);

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

    return 0;
}


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

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

int main(void)
{
    int size;
    scanf_s("%d", &size);
    printf("\n");

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

    for (int i = 0; i < size; i++)
    {
        // *numPtr처럼 포인터를 역참조한 것
        numPtr[i] = i;
        printf("%d\n", numPtr[i]);
    }

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

    return 0;
}


38.3 포인터에 할당된 메모리를 2차원 배열처럼 사용하기

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

int main(void)
{
    /* 3행 4열의 2차원 배열 */

    // 3행
    int** m = malloc(sizeof(int *) * 3);

    for (int i = 0; i < 3; i++)
    {
        // 4열
        m[i] = malloc(sizeof(int) * 4);
    }

    // 값 할당
    m[0][0] = 1;
    m[2][0] = 5;
    m[2][3] = 2;

    printf("%d\n", m[0][0]);
    printf("%d\n", m[2][0]);
    printf("%d\n", m[2][3]);

    for (int i = 0; i < 3; i++)
    {
        // 열 영역 메모리 해제
        free(i);
    }

    // 행 영역 메모리 해제
    free(m);

    return 0;
}

메모리를 할당할 때 행->열 순서로 할당했으므로, 해제할때는 반대로 열->행 순서로 해제한다.

행 공간에 해당하는 메모리를 먼저 해제해버리면 열 공간 메모리를 해제할 수 없으므로 주의하자.


38.4 입력한 크기만큼 메모리를 할당하여 포인터를 2차원 배열처럼 사용하기

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

int main(void)
{
    int row, col;

    scanf_s("%d %d", &row, &col);

    // 행
    int** m = malloc(sizeof(int *) * row);

    for (int i = 0; i < row; i++)
    {
        // 열
        m[i] = malloc(sizeof(int) * col);
    }

    for (int i = 0; i < row; i++) 
    {
        for (int j = 0; j < col; j++) 
        {
            m[i][j] = i + j;
            printf("%d ", m[i][j]);
        }
        printf("\n");
    }

    for (int i = 0; i < row; i++)
    {
        // 열 영역 메모리 해제
        free(m[i]);
    }

    // 행 영역 메모리 해제
    free(m);

    return 0;
}