[C언어] 동적 배열 생성하기 (1차원, 2차원)

동적 배열이란?

동적 배열은 heap을 이용하여 배열의 크기를 컴파일 단계가 아닌 실행시간에 가변적으로 바꿀 수 있는 배열을 말합니다

위 코드는 자바에서 동적배열을 생성하는 코드입니다. 하지만 이 코드를 그대로 C언어에서 생성해본다면 "식에 상수값이 있어야 합니다."라는 문구와 함께 에러가 나게 되는데요. 이렇듯 C언어에서는 Java와는 달리 변수를 배열의 길이에 오지 못하게 제한되어 있습니다. 그렇기 때문에 C언어에서는 동적 배열을 생성할때는 malloc함수를 활용하여 동적 메모리를 할당하는 방법을 써야 합니다. malloc함수에 대해 알고싶다면 아래 링크를 클릭해주세요.

[C언어] 메모리 동적할당 (malloc, free) 함수 사용법 & 예제

 

1차원 동적 배열 생성하기

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

int main() {
    int size;
    printf("배열의 사이즈 : ");
    scanf_s("%d", &size);

    int* arr = (int*)malloc(sizeof(int) * size); //동적할당

    for (int i = 0; i < size; i++)
        arr[i] = i;

    for (int i = 0; i < size; i++)
        printf("arr[%d] : %d\n", i,arr[i]);

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

    return 0;
}

동적배열을 생성하는 방법은 위와 같습니다. malloc함수를 사용하여 Heap에 원하는 크기만큼의 동적 메모리를 생성하고 사용하면 됩니다. 배열은 연속된 메모리의 공간을 말합니다. 그렇기에 메모리의 포인터에 동적으로 생성하고싶은 사이즈만큼의 공간을 할당하면 됩니다.

그림으로 표현하면 위와 같습니다. 먼저 포인터변수를 선언하고 Heap에 동적으로 만들어놓은 배열의 시작주소를 저장해주면 우리는 포인터 변수를 통해 동적할당된 메모리에 접근이 가능하며 동적으로 할당받은 메모리도 배열처럼 [index]로 접근이 가능합니다.

 

만약 NULL포인터를 역참조하고 있습니다. 버퍼 오버런이 발생하였습니다. 같은 경고가 뜬다면 해당 파일이 C로 되어있는지 확인해주세요. C++에서는 malloc함수를 사용하는것에서 new라는 연산자를 사용하는것으로 바뀌었기 때문에 경고가 뜹니다.

 

2차원 동적 배열 생성하기

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

int main() {
    int size;
    printf("배열의 사이즈 : ");
    scanf_s("%d", &size);

    //size만큼 배열의 세로 동적할당
    int** arr = (int**)malloc(sizeof(int*) * size);
    
    //size만큼 배열의 가로 동적할당 
    for (int i = 0; i < size; i++) { 
        arr[i] = (int*)malloc(sizeof(int) * size); 
    }

    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            arr[i][j] = i + j;
        }
    }

    //배열의 값 출력
    for (int i = 0; i < size; i++) {
        for (int j = 0; j < size; j++) {
            printf("arr[%d][%d] : %d   ", i, j, arr[i][j]);
        }
        printf("\n");
    }

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

    return 0;
}

1차원 배열을 동적 생성할때의 모습을 잘 보면 포인터 하나를 가지고 동적 할당한 메모리의 주소의 첫번째 위치를 참조하는 식으로 동적 배열을 생성하였습니다. 2차원 배열도 원리는 같습니다. 다만 2차원 배열이기에 2차원 포인터를 사용하여 두번 참조해주어야 합니다.

2차원 배열을 생성한다면 위와 같은 형식으로 메모리를 참조하게 됩니다.

 

 

 

댓글(1)

  • 익명
    2021.07.20 08:34

    백준 할 때마다 잘 쓰고 있어용^^ 비주얼 스튜디오는 배열 크기를 변수로 못 받아서 항상 이걸 사용한답니다 ㅋ

Designed by JB FACTORY