개성파 블로그

malloc함수, free함수와 이중 포인터를 이용한 malloc함수 본문

컴퓨터

malloc함수, free함수와 이중 포인터를 이용한 malloc함수

TWorld 2014. 2. 18. 02:19

void *malloc(size_t size);

void free(void *memblock);


malloc은 엠얼록이라고 읽습니다. 플랫폼에 따라 다르게 정의되어 있지만 대부분의 32비트 컴파일러들은 size_t를 unsigned의 부호 없는 정수형으로 정의합니다. 따라서 이론적으로 이 함수로 할당할 수 있는 최대 용량은 4G 바이트가 됩니다.


size는 바이트이므로 size의 숫자만큼 할당 받을 수가 있습니다. 예를 들어, 4바이트가 필요하면 malloc(4)를 호출하면 됩니다.


malloc함수는 운영체제에게 사용되지 않는 빈 영역(힙)을 찾아 요청한 만큼의 메모리 크기를 할당해서 그 시작 번지를 리턴합니다. 그리고 메모리 할당에 실패하면 NULL을 리턴합니다.


free함수는 malloc함수로 호출해서 할당된 메모리를 해제합니다. malloc함수를 호출한 번지 또는 응용프로그램이 끝나면 꼭 free함수를 호출하여 해제해야 합니다. 그렇게 해야 다른 프로그램이 해제한 영역을 사용할 수 있기 때문입니다. 대부분의 32비트 운영체제는 프로그램이 종료되면 free함수를 사용하지 않아도 알아서 동적 메모리를 회수합니다. 그렇다고 해서 free함수를 사용하지 않아도 되는 것은 아닙니다. 만약 해제하지 않은 소스를 다른 누군가가 자동적으로 해제하지 않는 운영체제에 돌려지면 문제가 발생할 수 있기도 하기 때문에 꼭! 해제하시기 바랍니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <Turboc.h>
 
void main()
{
     int *arScore;
     int i,stNum;
     int sum;
 
     printf("학생수를 입력하세요 : ");
     scanf("%d",&stNum);
     arScore=(int *)malloc(stNum*sizeof(int));
     if (arScore == NULL) {
          printf("메모리가 부족합니다.\n");
          exit(0);
     }
 
     for (i=0;i<stNum;i++) {
          printf("%d번 학생의 성적을 입력하세요 : ",i+1);
          scanf("%d",&arScore[i]);
     }
 
     sum=0;
     for (i=0;i<stNum;i++) {
          sum+=arScore[i];
     }
 
     printf("\n총점은 %d점이고 평균은 %d점입니다.\n",
          sum,sum/stNum);
     free(arScore);
}

소스 : SoEn



이중 포인터 형식으로 malloc함수를 사용하는 방법은 간단합니다. 


p[3][4]와 같은 배열 형식을 만든다고 하면 처음에 이중 포인터 하나를 만들고 이 이중 포인터를 malloc함수로 할당 받고, 할당 받은 메모리를 각각 위에 또 할당 받으시면 됩니다.


아래 소스를 보시면 이해가 되실 것입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int **p;
    p = (int **)malloc( sizeof(int *) * 3 );
 
    p[0] = (int *)malloc( sizeof(int) * 4 );
    p[1] = (int *)malloc( sizeof(int) * 4 );
    p[2] = (int *)malloc( sizeof(int) * 4 );
 
    free(p[0]);
    free(p[1]);
    free(p[2]);
 
    free(p);
    return 0;
}



도움이 되셨으면 손가락 모양을 클릭해주세요 ^^

Comments