본문 바로가기
컴퓨터일반

C 언어 이차원 동적 배열

by 남성 2011. 10. 5.

C 코딩 시 동적 배열은 malloc() 또는 calloc() 함수를 주로 사용한다.

 

보통 malloc() 함수는 다음과 같이 사용한다.

 





Int * Arr; // 배열에 대한 포인터 선언

 

Arr=(int *)malloc(X * sizeof(int)); // malloc() 함수 이용 동적 배열 선언, X 는 배열의 크기 , Arr[0], Arr[1]… 등으로 각 인자의 값에 접근

 

free(Arr); // 동적 배열 free


 

 

calloc() 함수는 다음과 같이 사용한다.

 

Int * Arr; // 배열에 대한 포인터 선언

 

Arr=(int *)calloc(X , sizeof(int)); // calloc() 함수 이용 동적 배열 선언, X 는 배열의 크기 , Arr[0], Arr[1]… 등으로 각 인자의 값에 접근

 

free(Arr); // 동적 배열 free 

 

malloc(), calloc() 함수의 차이는 calloc() 함수의 경우 초기값을 0으로 셋팅 한다는 거다.

 

두 함수는 stdlib.h 안에 포함되어 있으므로 두 함수를 이용할 때는 파일의 윗줄에 #include <stdlib.h> 를 해 줘야 한다.

 

동적 배열을 이용한 이차원 배열은 다음과 같다.

 

int i, m, n ; // m 행 n 열 배열을 잡기 위한 변수

double** matrix; // double 형 2차원 동적 배열을 잡기 위한 포인터

matrix=( double **)calloc(m, sizeof(double *)); // m 행을 동적 배열로 잡음

 

for (i=0;i<m; i++) // m 행만큼 루프를 돌면서 각 행 마다 n 열씩 동적 배열을 잡음

{

       matrix[i]=( double *)calloc(n,sizeof(double));

}


 

matrix[0] [0], matrix[0] [1] … 과 같이 2차원 배열의 각 인자에 접근

 

 

동적 배열을 해제 할 때는 다음과 같이 한다.

 

for (i=0;i<m;i++)

{

    free(matrix [i]);

}

free(matrix);


 

이상이 C 코딩 시의 2차원 동적 배열 설정 및 해제 방법 이다.

 



그런데 저런 2차원 배열을 여러 개 쓸 때는 매번 저렇게 설정하는 게 짜증 날 것이다.

 

따라서 동적 배열의 설정 및 해제를 함수로 만들어서 사용한다.

 

다음은 Numerical Recipe in C 라는 책에 소개된 동적 메모리 할당 및 해제 하는 함수들이다.

 

double * get_dvector_space(int m) // 1차원 double 형 동적 메모리 할당 , m 행

{

    double* cm;

    cm=(double *)calloc(m,sizeof(double));

    return cm;

}

 

void free_dvector(double* cm) // 1차원 double 형 동적 메모리 해제

{

    free(cm);

}

 

double** get_dmatrix_space(int m,int n) // 2차원 double 형 동적 메모리 할당 , m 행 n 열

{

    int i;

    double** cm;

    cm=(double **)calloc(m,sizeof(double *));

    

    for (i=0;i<m;i++)

    {

        cm[i]=(double *)calloc(n,sizeof(double));

    }

    return cm;

}

 

void free_dmatrix(double** cm, int m) // 2차원 double 형 동적 메모리 해제

{

    int i;

    

    for (i=0;i<m;i++)

    {

        free(cm[i]);

    }

    

    free(cm);

 



Int 형 동적 메모리 할당 및 해제 함수는 저 위의 함수에서 double 만 int 로 바꾸고 함수이름도 dvector 부분을 ivector 등으로 적절히 바꿔서 만들어 주면 될 것이다.


다른 형으로 바꿀 때도 마찬가지다.

 
위 함수를 이용하는 방법은 다음과 같다.

 

double * arr;

arr = get_dvector_space(10); // 1차원 배열 선언

free_dvector(arr); // 해제

  

double ** matrix;

matrix = get_dmatrix_space (10,10); // 2차원 배열 선언

free_dmatrix (matrix, 10); // 해제


 

근데 C 언어에서는 각 변수 타입 마다 저 위와 같은 함수들을 다 만들어줘야 한다. Double 일 때 함수 int일 때 함수 float 일 때 함수 …등... 다 만들어 줘야 한다. ㅡㅡ;

 



이렇게 만들기도 참 귀찮은 일이다.

 

따라서 C++ 로 갈아타서 template 을 사용하자.

 

다음과 같이 template 함수로 선언 할 수 있다.

 

// template_buffer.h 파일

 

#include <stdlib.h>

 

template<typename T>

 

T* get_vector_space(int m)

{

    T* cm;

    cm=(T *)calloc(m,sizeof(T));

    return cm;

}

 

 

template<typename T>

void free_vector(T* cm)

{

    free(cm);

}

 

template<typename T>

T** get_matrix_space(int m,int n)

{

    int i;

    T** cm;

    cm=(T **)calloc(m,sizeof(T *));

    

    for (i=0;i<m;i++)

    {

        cm[i]=(T *)calloc(n,sizeof(T));

    }

    return cm;

}

 

template<typename T>

void free_matrix(T** cm, int m)

{

    int i;

    

    for (i=0;i<m;i++)

    {

        free(cm[i]);

    }

    

    free(cm);

}

 




Template 함수에 대한 내용은 이전 포스팅을 참조하자.

2011/03/06 - [컴퓨터일반] - [C++] template
 



위 함수들을 이용한 간단한 예제 코드는 다음과 같다.

 

// Vector_test.cpp

 

 

#include <stdio.h>

#include "template_buffer.h"

 

 

int main(int argc, char **argv)

{    

    int n, i;

      

    

    double *double_vector, **double_matrix;

    int * int_vector, **int_matrix;    

    

    double_vector = get_vector_space<double>(2);     // double 형 1차원 배열

    int_vector = get_vector_space<int>(2); // int 형 1차원 배열

    

    double_matrix = get_matrix_space<double>(2, 3);     // double 형 다차원 배열, 2 x 3

    int_matrix = get_matrix_space<int>(2, 3);          // int 형 다차원 배열, 2 x 3

        

    for (n=0;n<2;n++)

    {

        double_vector[n]=n*3.1;  // 걍 곱하기

        int_vector[n]=n*3;          // 걍 곱하기

        

        

        for (i=0;i<3;i++)

        {

            double_matrix[n][i]=n*i*3.1;   // 걍 곱하기

            int_matrix[n][i]=n*i*3;             // 걍 곱하기

     }

    }    

                

        

    // Buffer 입력된 값 확인

    

    for (n=0;n<2;n++)

    {

        printf("vector %g    %d\n",double_vector[n],int_vector[n]);

        

        for (i=0;i<3;i++)

        {            

            printf("Matrix %g    %d\n",double_matrix[n][i],int_matrix[n][i]);                    

     }

    }        

                

    free_vector(double_vector); // double vector 해제

    free_vector(int_vector); // int vector 해제

      

    

    free_matrix(double_matrix,2); // double matrix 해제

    free_matrix(int_matrix,2); // int matrix 해제

            

    return 0;

}

 




위 코드를 Geany 에서 컴파일 및 실행 하면 다음과 같은 결과가 나온다

 

 

 

C 동적 메모리 할당부터 쭉 어케 저케 오다 보니 위와 같은 C++ template까지 설명을 했다.

 



 

참고로 … C++ 에서 동적 배열 생성시에는 malloc(), calloc() 보다는 new 라는 키워드를 이용한다.

 

또한 벡터를 저렇게 template 을 만들면서 까지 쓸 필요가 없다.

C++ STL (Standard Template Library) 에 <
vector > 라는 헤더 파일이 있으니 참조하기 바란다.


댓글0