c·c++/c 프로그래밍

배열의 크기를 동적으로 늘리는 방법

바로이순간 2012. 4. 23. 09:31

초보자들이 이해할수 있도록 짠 배열의 크기를 동적으로 늘려가는 방법이다.

물론 STL을 사용한다면 훨씬 자유롭게 코딩을 할수 있지만 그 전에라도

초보자들이 사용할 수 있는 유용한 방식이 될 수 있다고 본다.


아래 프로그램에서는 동적으로 할당받은 공간의 맨 앞방을 크기를 나타내는 용도로

사용하였다. 실제로 사용하는 배열은 1번째 방부터 사용한다. 그렇게 하면 인덱스의

사용에 문제가 있으므로 배열의 시작점을 1번째 방부터 하도록 하였다.


그래서 배열의 크기를 나타낼 때에는  -1이라는 인덱스를 사용하게 된다.

설명은 복잡하게 보일지 모르지만 코드는 간단하다 한번 보도록 하자


입력의 끝을 나타낼 경우에는 q를 주도록 한다.


#include <stdio.h>

#include <stdlib.h>

int *creat() { // 테스트를 위해서 일부러 작은 크기 5을 주었음

    int *temp;

    temp=(int*)malloc(6*sizeof(int));

    temp[0]=5;

    printf("new size: %d ", temp[0]);

    return &temp[1];

}

int *enlarge(int *arr) { // 크기가 5씩 증가함

    int *temp;

    int size=arr[-1];

    int i;

    temp=(int*)malloc((size+5+1)*sizeof(int));

    temp[0]=size+5;

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

    free (&arr[-1]);

    printf("new size: %d ", temp[0]);

    return &temp[1];

}

int size4(int *arr) {

    return arr[-1];

}

int main() {

    int i, n, x;

    int *arr;


    arr=creat();

    printf("arr=0x%p\n",arr);


    i=0;

    while(1) {

        printf("입력: ");

        n=scanf("%d", &x);

        if(n==0) break;

        arr[i++]=x;

        if(size4(arr)<=i) {

            arr=enlarge(arr);

            printf("arr=0x%p\n",arr);

        }

    }

    n=i;

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

    free(&arr[-1]);


    return 0;

}