Recommanded Free YOUTUBE Lecture: <% selectedImage[1] %>

malloc(2)

1장. malloc(2)

차례
1.1절. 사용법
1.2절. 설명
1.3절. 반환값
1.4절. 예제
1.5절. 참고문헌

동적 메모리 할당 및 해제


1.1절. 사용법

#include <stdlib.h>

void *malloc(size_t size);
void *calloc(size_t size);
int free(void *ptr); 
void *realloc(void *ptr, size_t size);
		


1.2절. 설명

malloc() 는 size 크기만큼의 메모리(:12)를 (동적으로)할당하기 위해서 사용한다. malloc()은 호출에 성공한뒤 할당된 메모리영역을 가르키는 포인터를 반환한다. malloc()을 이용해서 할당된 메모리 영역은 자동으로 clear 되지 않는다. 더이상 사용하지 않는 메모리영역은 반드시 free() 를 이용해서 clear 해주도록한다. 그렇지 않을경우 메모리 누수가 일어날수 있다.

calloc()는 size크기를 가지는 nmemb요소 만큼의 공간을 할당한다. 메모리는 0으로 설정된다.

realloc()는 ptr가 가르키는 메모리영역의 크기를 size만큼 조절한다. 메모리 영역에 있던 데이터는 그대로 남아 있게 된다. 만약 ptrNULL을 가리키고 있었다면 malloc(size)와 동일한 수행을 보여준다. size가 0이라면 free(ptr)과 동일한 수행을 보여준다.

free()는 ptr가 가르키는 메모리 영역을 해제한다. malloc(), calloc(), realloc()를 사용한 메모리영역을 더이상 사용하지 않는다면 free()를 호출해서 자원의 낭비를 막도록 한다. ptrNULL이라면 아무런 일도 수행하지 않은 경우가 된다.


1.3절. 반환값

calloc(), malloc()는 할당된 메모리를 가리키는 포인터를 리턴한다. 실패했다면 NULL을 리턴한다.

free()는 값을 리턴하지 않는다.

realloc()는 새로할당된 메모리를 가리키는 포인터를 리턴한다. 실패할 경우 NULL을 리턴한다. realloc()가 실패하더라도 이전 메모리가 해제되거나 이동하는 일은 발생하지 않는다. 만약 realloc()요청한 메모리의 크기가 충분히 커서 이전 포인터 영역에서 연속된 메모리 공간을 할당할 수 없게 된다면 공간확보가 가능한 다른 영역으로 복사된다.


1.4절. 예제

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

struct name
{
    int     age;
    char    name[25];
};
int main()
{           
    char *org_name;
    struct name *myname;
    int i;
                       
    // org_name 에 char 이 25만큼 들어갈수 있는
    // 메모리 공간을 할당한다.                                                
    // malloc 는 할당된 메모리 영역의 포인터를 리턴해주므로
    // org_name 은 malloc 를 이용해 할당된 영역의 포인터를 가르키게 된다.
    org_name = (char *)malloc(sizeof(char)*25);
                                                                               
    // myname 역시 마찬가지로 struct name 이 2개 만큼 들어갈수
    // 있는 메모리 공간을 할당한다.
    myname = (struct name *)malloc(sizeof(myname)*2);                         

    strcpy(org_name, "yundream");
                                                                              
    myname[0].age = 25;
    strcpy(myname[0].name, org_name);

                                                                               
    strcpy(org_name, "testname");                                             
    myname[1].age = 28;                                                       
    strcpy(myname[1].name, org_name);                                          
                     
    for(i = 0; i < 2; i++)
    {                           
        printf("%d : %s\n", myname[i].age, myname[i].name);
    }                                                                         
}
		

위의 코드를 보면 org_name 라는 char 형 포인터가 선언되어 있다. 처음 선어시에 이 포인터는 아무것도 가르키지 않고 있음으로, 이 포인터를 사용하기 위해서는 메모리를 할당하고 할당된 메모리의 주소를 가르키도록 만들어 줘야 한다.

 malloc 사용전
              
 +-- 4byte -+ 
              
 +----------+ 
 | org_name | 
 +----------+          ?
     |                 |
     +-----------------+
                        
 malloc 사용후          
                      +- 25 byte -+
                                   
 +----------+         +------------+
 | org_name |         |MEMORY      |
 +----------+         +------------+
     |                 |            
     +-----------------+