C 언어 - 배열의 한계 (선언과 동시에 크기의 불변)

컴퓨터/C

728x90
반응형

배열의 한계

사실 지난 포스트들에서 배열을 정적 동적으로 선언하는 다양한 방법들에 대해 많이 다뤘습니다. 하지만 다양한 자료구조들을 공부하고 구현해 보는 데에 있어 배열에 대하여 분명하게 특징을 알고 있어야만 왜 복잡한 자료구조들을 사용하게 되는지 알 수 있을 것입니다. 그럼 배열의 특징.. 한계에 대해 알아보도록 하겠습니다.

 

1. 배열은 선언과 동시에 크기를 가진다 ( 즉 , 고정된 크기만을 가질 수 있다.)

배열은 선언과 동시에 배열의 크기가 정해집니다. 즉 공간이 부족해서 배열을 늘리거나 줄이기는 어렵다는 말 입니다. 

따라서 배열을 선언할 시 크기에 들어갈수 있는 인자는 정확한 크기를 알려줄 수 있는 상수들만 가능합니다.

#include<stdio.h>

int main() {
	int arr[100]; 
	// int max_size = 10; 변수를 대입하면 error가 발생합니다.
	const int max_size = 10;
	int arr2[max_size];
	return 0;
}

이처럼 배열을 선언과정에서 공간을 정의하는 크기는 상수 화가 필요합니다. 

그렇다면 사용자가 필요한 시점에 변수를 이용해 배열의 크기를 선언하고 싶다면 어떻게 될까요? 

#include<stdio.h>

int main() {
	int arr_size;
	printf("선언할 배열의 크기를 입력 하세요 : ");
	scanf("%d", &arr_size);
	int arr[arr_size] // 에러 발생!
	return 0;
}

결국 변수가 배열 크기를 선언하고 싶기 때문에 에러가 발생합니다.

이런 문제점을 해소하기위해서 아래와 같은 방법을 사용할 수 있습니다.

 

2. 동적 메모리 할당을 이용한 배열의 구현

C언어에서 제공하는 문법으로 배열을 구현을 하려면 배열의 크기는 상수만을 통해서 정의할 수 있습니다. 

하지만 동적메모리할당을 통해 배열을 구현한다면 다음과 같이 배열의 크기를 사용자의 입력으로부터 선언할 수 있습니다.

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>


int main()
{
    int size;
    printf("원하는 배열의 크기를 정하세요 : ");
    scanf("%d", &size);

    int* parr = malloc(sizeof(int) * size); // 동적 메모리 할당 입력받은 사이즈 * int 크기만큼 
                                            // 이 할당받은 메모리 시작 주소를 포인터에 대입
    if (parr == NULL)
    {
        printf("동적 메모리 할당 실패 !\n");
    }
    else
    {
        for (int i = 0; i < size; i++)
        {
            *(parr + i) = i;  // int크기만큼 주소연산을 하며 동적메모리에 int크기만큼에 값 넣기
        }
        for (int i = 0; i < size; i++)
        {
            printf("%d\n", *(parr + i));  // 동적 메모리에 저장된 값 출력
        }
    }
    free(parr); // 사용 완료한 동적메모리 할당 해제
    return 0;
}

 

3. 또다른 한계점 

이제 2가지 방법을 통해서 우리는 배열을 선언하고 시작 공간을 자유롭게 설정하는 기법들을 알아보았습니다. 

하지만 아직가지도 배열은 분명한 한계점을 가지고 있습니다. 

만약 선언된 배열의 공간을 모두 사용하고 나서도 공간이 더 필요하다면 어떻게 될까요?  

또는 너무 많은 공간이 잡혀 있어 불필요한 메모리 사용이 많아 공간을 줄이고 싶다면 어떻게 할까요? 

10개의 공간중 5번째 배열의 값을 지우면 전체의 크기가 줄어드는 것이 5번째 값이 없는 것일 뿐입니다. 

이런 배열의 한계때문에 다양한 방법의 자료구조들이 연구되고 사용되고 있습니다. 이런 자료구조들을 C언어를 통해 구현해보며 학습해 보도록 합시다.

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :