본문 바로가기
프로그래밍/자료구조

[C언어와 함께 자료구조를] 동적 기억장소 할당

by 헬맷쓰다 2015. 3. 12.
반응형

C언어에서 배열은 길이를 미리 알 수 있을 때 고정된 크기의 정적배열을 사용합니다. 만약에 길이의 상한을 알 수 없을 때는 동적 배열을 사용할 수 있습니다. 동적 배열을 사용하기 위해서는 배열의 공간 확보를 위해 메모리 할당 (memory allocation)을 해야합니다.

동적 문자열 할당

C언어에서는 메모리 할당을 위해 아래와 같은 함수를 사용합니다.

#include <stdlib.h>

void *malloc (size_t size);
void free(void *ptr);

malloc()은 size bytes만큼의 메모리를 할당하고, 할당된 메모리의 포인터를 반환합니다. 만약, 메모리 할당에 실패하면 NULL을 반환합니다. 할당된 메모리는 초기화되어 있지 않으므로 사용전에 반드시 초기화를 하여야 합니다. 그리고 더이상 사용하지 않는 메모리는 free()를 통해 반환해야 합니다.

예를 들어, 다음과 같은 문장을 살펴봅시다.

char a_buf[10]; 
char *p_buf; 

p_buf = malloc(10); 
if (p_buf == NULL) 
	ASSERT("FAIL to MALLOC");

위의 문장에서 a_buf와 p_buf는 동일한 크기의 메모리를 갖고 있으며, 배열과 완전히 동일하게 참조할 수 있습니다.

 

동적 구조체와 배열

위에서 malloc()의 선언을 보면 type이 void *라는데 주목하셔야 합니다.

기본적으로 malloc()은 함수의 인자인 size만큼의 메모리를 동적 할당 하는데요. 문자형(char)이 아닌 double형의 변수 n개만큼 할당하려면 어떻게 할까요?

double *pd_buf;

pd_buf = (double *) malloc(n*sizeof(double));
if (pd_buf == NULL)
    ASSERT("FAIL to MALLOC");

위의 두번째 문장을 보면 n개에 double 형의 크기(sizeof(double))를 곱한 만큼의 size를 malloc()의 함수인자로 줬군요. 그리고 pd_buf가 double *이므로 형변환 (type casting)을 해줬다는 것을 알 수 있습니다.

자, 조금만 더 나가 볼까요? 지난 포스팅 구조체 알아보기에서 봤던 사원명부 구조체에 한번 적용해 보겠습니다.

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h>

typedef struct employee {
    char *name;
    int  hire_date;
    int  birth;
    int  tel;
} employee_t;

#define CHUNK 10

employee_t make_structure (char *name, int hire, int birth, int tel)
{
    employee_t result;
    result.name = (char *)strdup(name);
    result.hire_date = hire;
    result.birth = birth;
    result.tel = tel;

    return result;
}

main ()

{
    int i;
    employee_t *mem;

    mem = (employee_t *)malloc(CHUNK*sizeof(employee_t));
    mem[0] = make_structure("James Dean", 121212, 3213211, 12312);    
    mem[1] = make_structure("Micle Jackson", 121212, 3213211, 12312);    
    mem[2] = make_structure("Hong Gil Dong", 121212, 3213211, 12312);

    for (i=0; i < 3; i++, mem++) {
        printf ("name = %s\n", mem->name);
    }
    return;
}

main 함수를 보면 mem이라는 구조체 포인터변수로 CHUNK*sizeof(employee_t) 의 양만큼의 메모리를 할당했습니다.

할당된 메모리는 mem[0], ... mem[2] 처럼 배열처럼 사용했군요.

마지막으로 mem이라는 구조체 포인터를 참조하는 부분을 유심히 보시면 구조체 포인터에서 변수를 참조할 때는 ->를 쓴다는 것을 알수 있구요. for문의 조건을 보면 mem++을 하는데 그렇게 하면 구조체 배열의 다음 요소를 가리킨다는 것을 알수 있겠네요.

여러가지 자료구조형을 공부할때 구조체와 구조체의 메모리 할당에 대한 내용이 자주 나오므로 확실히 알고 넘어가야 합니다.

자..오늘은 이정도로 마치고 다음 시간에는 여러가지 자료구조 중에서 스택과 큐에 대해 알아 보겠습니다.

고맙습니다.

반응형

댓글