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 > 라는 헤더 파일이 있으니 참조하기 바란다.
'컴퓨터일반' 카테고리의 다른 글
Vim plug-in visincr (0) | 2011.12.14 |
---|---|
Gvim ctags 이용하기 (0) | 2011.12.03 |
갤럭시 탭에서 교보 eBook 사용하기 (0) | 2011.11.20 |
토렌트 RSS 다운로드 (0) | 2011.11.01 |
C, C++ printf(), scanf() 특수 문자 (2) | 2011.09.24 |
윈도우 제어판 확장 파일 (0) | 2011.09.16 |
네이버 가계부 업데이트-사용처/사용내역 자동 분류 (0) | 2011.05.26 |
MS word 자동 고침 (0) | 2011.05.05 |
댓글