'메모리할당'에 해당되는 글 2건

  1. 2008.08.28 구조체가 메모리에 할당되는 크기
  2. 2008.03.09 자료구조. malloc, calloc 사용법 (2)
구조체의 메모리 할당은 멤버들을 주어진 순서대로 할당한다.

      1 /*
      2  * 작성일 : 2008. 08. 28.
      3  * 작성자 : 박상현[정보통신총괄]
      4  * 내 용 : 구조체 테스트
      5  */
      6
      7 #include <stdio.h>
      8
      9 int main()
     10 {
     11         struct A1
     12         {
     13                 char a;
     14                 int b;
     15                 char c;
     16         } X;
     17
     18         struct A2
     19         {
     20                 char a;
     21                 char b;
     22                 int c;
     23         } Y;
     24
     25         printf("X sizeof : %d, Y sizeof : %d\n", sizeof(X), sizeof(Y));
     26         return 0;
     27
     28 }
     29

[linux6@cam00 four]$ make
cc -O2 -Wall -Os -g -I/usr/include -c struct.c
cc -o struct  struct.o
[linux6@cam00 four]$ ./struct
X sizeof : 12, Y sizeof : 8

결과에서 보는 것처럼 A1, A2 두 구조체에는 똑같이 char 둘, int 하나씩 정의했으나,

각각의 크기는 12 와 8 로 차이가 났다.

X 구조체를 보면 메모리에 4바이트를 할당한 후 a 멤버를 저장한다. 다음 멤버 b 는 정수이므로

3바이트 남은 공간에 저장될 수 없으므로 3개의 바이트를 건너뛰어 적정한 경계로 이동한다.

그리고 4바이트 할당 후 저장된다. 마지막으로 c 멤버를 위해 4바이트 할당 후 저장한다. 따라서

12바이트를 사용하게 된다.

그러나 Y 구조체는 경계 정렬이 적게 일어나는 멤버들을 인접하여 배치함으로써 구조체 빈 공간을

최소화하였다.

A2 구조체와같이 효율적으로 멤버들을 배치함으로써 낭비되는 공간을 줄이도록 하자.
Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요


malloc 과 calloc 는 기본적으로 힙에 메모리 영역을 할당하는 함수이다.

참고로 heap 이란 데이터 세크먼트의 끝과 스택의 상위부분 사이에 있는

당장 쓰이지 않는 영역을 말한다.

calloc 이 malloc 에 비해 다른점은 할당할 메모리의 양을 표시하는 방법이다.

calloc 은 구조체나 배열의 동적 메모리 할당을 위해 주로 사용되며

메모리 해제는 malloc 처럼 free 로 하면 된다.

calloc 은 다음과 같이 사용한다.

int *fi;

fi = (int *)calloc(5, sizeof(int));

malloc 은 다음과 같이 사용한다.

int *fi;

fi = (int *)malloc(sizeof(int) * 5));

이렇게 하면 결국 같은 뜻이 되는 것이다.

*fi = 1, *(fi + 1) = 2, *(fi + 2) = 2, ...

위처럼 사용하면 된다.

아 그리고 또 하나의 차이점은 calloc 으로 메모리를 할당하게 되면

모두 0으로 초기화 된다는 것이 malloc 과의 차이점이다.

참고로 다음처럼 매크로로 만들어서 사용해도 편리하겠다.

// malloc 매크로로 지정
#define MALLOC(p,t,s)  if(!((p) = (t*)malloc(s))) { fprintf(stderr, "Insufficient memory"); exit(EXIT_FAILURE); }

 // 매크로를 사용한 메모리 할당
 MALLOC(pi, int, sizeof(int));

마지막으로 잊지 말아야 할 것은

항상 메모리 공간이 필요없게 되면

free(fi); 해서 해제를 해주어야 한다는 것. 잊지말도록 하자.

Posted by 행복한 프로그래머 궁금쟁이박

댓글을 달아 주세요

  1. afewgoodman 2009.12.01 16:02  댓글주소  수정/삭제  댓글쓰기

    calloc과 malloc의 차이점 중 중요한 것이 빠졌네요. malloc은 메모리 초기화 없이 그냥 할당하고요... calloc은 메모리 초기화를 시켜서 할당 합니다.