38.0 포인터와 배열 응용하기

지금까지 크기가 고정된 배열을 사용했습니다. 이번에는 포인터에 메모리를 할당하여 배열처럼 사용해보겠습니다.

먼저 배열은 소스 코드에서 크기를 지정해서 생성해야 합니다.

//         ↓ 배열 크기 지정
int numArr[10];

하지만 다음과 같이 프로그램 실행 중에 원하는 크기만큼 배열을 생성하는 기능(가변 길이 배열)은 GCC에서는 지원하지만, Visual Studio 2022에서는 지원하지 않습니다.

variable_length_array.c

#define _CRT_SECURE_NO_WARNING
#include <stdio.h>

int main()
{
    int size;

    scanf("%d", &size);  // 배열의 크기를 입력받음

    int numArr[size];    // GCC에서는 사용 가능, Visual Studio 2022에서는 컴파일 에러

    return 0;
}

컴파일 결과

variable_length_array.c(10): error C2057: 상수 식이 필요합니다.
variable_length_array.c(10): error C2466: 상수 크기 0의 배열을 할당할 수 없습니다.
variable_length_array.c(10): error C2133: 'numArr': 알 수 없는 크기입니다.

scanf로 배열의 크기를 입력받은 뒤 배열을 생성할 때 [ ]안에 변수를 지정하였습니다. 그렇지만 Visual Studio 2022에서는 가변 길이 배열을 지원하지 않아 컴파일 에러가 발생하죠.

그럼 배열의 크기를 동적으로 지정하려면 어떻게 해야 할까요? 크기를 동적으로 지정하려면 포인터를 선언하고 메모리를 할당한 뒤 메모리를 배열처럼 사용해야 합니다.

참고 | 가변 길이 배열

C 언어는 int numArr[10];처럼 고정된 크기로 배열을 생성하는 것은 가능하지만 int numArr[size];처럼 크기를 동적으로 지정할 수는 없었습니다. 이후 C99 표준이 제정되었고 가변 길이 배열(Variable-Length Array, VLA) 기능도 추가되었습니다. GCC, Clang 등의 컴파일러는 가변 길이 배열을 지원하지만 Visual Studio 2022는 아직 지원하지 않습니다.

참고로 이제부터 설명할 내용은 포인터와 배열을 응용하는 방법이라 문법이 복잡하고 개념이 조금 어렵습니다.