Computer Language/C

alloc의 3가지 종류와 2차원 배열 동적할당

Ohjeonghak 2013. 12. 27. 12:10
반응형

-alloc에는 3가지 종류

 

malloc, calloc, realloc  이 3가지의 alloc은 각각 기능의 장단점과 차이가 분명히 있다.

용도에 맞게 잘 사용하면 보약이고 그렇지 않다면 독약이 된다.

사용 방법을 간혹 잊어버릴 수 있으니 간단히 정리를 해 둘 필요성이 있어 포스팅 한다.

 

1. 배열의 동적 할당을 위한 malloc

 

    대량의 데이터를 처리할 때 배열은 아주 유용하게 처리 되었다. 하지만 데이터의 특성에 따라 데이터의 길이가 동적인

    경우가 있다. 하지만 배열은 한번 선언 하면 배열의 크기는 중간에 바꿀수가 없기 때문에 여유공간을 생각해서 넉넉히

    큰 크기의 배열을 선언해서 사용하는 메모리 적으로 비효율적인 점이 있다. 이를 개선 하여 사용 할 수 있도록 해 주는

    동적 배열이 있다. 동적배열은 malloc을 이용하여 간단히 사용 할 수 있다.

 

malloc 의 기본형

 void *malloc(size_t size);

즉, 사용할때 원하는 데이터의 타입의 데이터 길이만큼 동적으로 받아와서 사용 할 수 있는 구조이다.

 

ex) int *arr = (int *)malloc( sizeof(int) * n);

     

      위의 수식을 해석해 보면 다음과 같다.

 

     int 형 포인터 배열 = (인트형 포인터타입으로) malloc ( int형 사이즈로 * 포인터 배열의 길이만큼 동적생성);

 

항상 alloc을 사용하면 free를 이용하여 할당한 메모리를 해제 해줘야 한다.

 

free 의 기본형

 void free( void *memblock );

사용 방법은 간단하다. 위에서 언급한 예제 에서 언급한 arr을 해제해 주면 된다.

 

ex) free(arr);

 

그리고 동적 할당을 해서 배열을 사용해도 free를 하여 다시 동적할당을 하지 않으면 중간에 동적 배열의 크기를 바꿀 수는 없다. 바꾸고 싶다면 free를 하고 다시 동적 할당을 해서 사용하던지 나중에 언급할 realloc을 이용해야 한다.

 

 

2. 배열의 동적할당을 위한 calloc

 

    calloc 함수도 malloc 함수처럼 메모리를 할당 해 주는 함수이다. 하지만 이 둘의 함수엔 차이점이 있다.

    malloc은 바이트 단위로 메모리를 할당 하지만 calloc은 메모리를 바이트 단위로 할당하지 않고 어떤 데이터형을

    단위로 해서 메모리를 할당한다. 그리고 메모리 할당이 성공적으로 되면 할당된 메모리는 0으로 초기화 되고 첫 번째

    바이트에 대한 포인터를 리턴한다. 만약 메모리 할당에 실패하거나 할당되는 사이즈가 0이라면 NULL 값을 리턴한다.

 

calloc 의 기본형

 void *calloc( size_t num, size_t size );

사용 방법은 malloc과 아주 비슷하다.

 

ex) int *arr = (int *)calloc(num, sizeof(int));

 

위의 수식을 해석해보면  다음과 같다.

   

      int 형 포인터 = (int 타입)calloc ( 포인터 배열 길이 , int형의 크기);

 

물론 malloc과 같이 꼭 free를 해줘야 한다.

 

ex) free(arr);

 

 

3. 동적 배열의 크기 재할당을 위한 realloc

malloc 과 calloc의 단점은 free를 해주기 전까지는 동적으로 할당한 배열의 크기를 다시 변경 할 수 없다는 거다.

realloc을 사용하면 그 문제를 해결 할 수 있다.

 

realloc 의 기본형

 void *realloc( void *memblock, size_t size );

 

realloc은 이전의 할당된 메모리를 확장하거나 새로운 메모리를 할당 할때 사용 한다.

정상적으로 메모리를 할당하면 주소를 반환하지만 인수가 NULL인 경우, 메모리가 부족해 실패한 경우 NULL을 반환한다.

 

ex) int *arr = (int *)malloc( sizeof(int) * n );

//or int *arr = (int *)calloc(n, sizeof(int));

//위의 상황처럼 malloc이나 calloc으로 동적 메모리를 할당 했을경우

 

arr = (int *)realloc(arr, sizeof(int) * n);

//위의 수식을 해석해 보면 아래와 같다.

//arr을 할당 = (인트형 타입으로) realloc ( arr 배열을, (int 크기로) * 배열크기만큼 재할당);

 

주의 할점은 모든 alloc은 사용 이 끝났다면 free 해 줘야 한다.

 

 

===========================================================================================================

 

2차원 배열 동적 할당

 

1. malloc을 이용한 2차원 배열 동적 할당

 int **arr;

arr = (int **)malloc( sizeof(int*) * 배열 크기);

 

for( int i=0; i<배열 크기; i++)

{

    arr[i] = (int *)malloc( sizeof(int) * 배열 크기);

}

 

반드시 할당 해준 크기만큼 모두 해제를 해줘야 한다.

 

 for( int i=0; i<배열 크기; i++)

{

    free(arr[i]);

}

free(arr);

 

 

 

2. calloc을 이용한 2차원 배열 동적 할당

 int **arr;

arr = (int **)calloc( 배열 크기, sizeof(int*));

 

for( int i=0; i<배열 크기; i++)

{

    arr[i] = (int *)calloc( 배열 크기, sizeof(int));

}

 

반드시 할당 해준 크기만큼 모두 해제를 해줘야 한다.

 

 for( int i=0; i<배열 크기; i++)

{

    free(arr[i]);

}

free(arr);

 

 

 

반응형