C언어 문서화

(C언어) 12. 동적할당

Mosu(정종인) 2016. 4. 6. 03:13
반응형

[포인터 - 동적할당]


동적 할당이 필요한 이유1 : 메모리 상에서 너무 많은 값을 낭비할 때

동적 할당이 필요한 이유2 : 메모리가 너무 작아서 전체의 값을 담을 수 없을때


행정구역 : 


data - 초기화된 변수

bss - 초기화 안된 전역변수 = 0으로 초기화됨

stack - 지역변수, 함수가 호출되고 반환될때

heap - 동적할당된 변수

txt


동적할당된 변수는 말에 나온 대로 heap애 저장된다. 


<동적할당을 하기 위해 필요한 것>(#include <stdlib.h>)

1. malloc

엠얼록, 또는 멀록, 또는 말록, 또는... 읽는 방법은 다양하다. 

쓰는 방법 : 동적할당을 하고 싶을 때(그 할당한 값들이 0으로 초기화 안되있어도 상관없을때)

type *[포인터변수명]=malloc[type_size];

이때 malloc은 메모리 할당만 해주는 것이기 때문에 리턴값은 void 포인터 이다.

이것 때문에 아래 예시의 5번 줄에서 malloc앞에 (int *)을 해줌으로써 할당한 메모리 안에 정수형 데이터가 들어간다는 것을 컴퓨터에 알려준다.

인자로 type_size를 받은 다음, 그 type_size만큼의 메모리를 할당한다.

그리고 그 할당한 메모리의 주로를 포인터변수명에 넣어준다.

⚇예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int *arr=(int *)malloc(sizeof(int)*4);
//  int *arr=(int *)malloc(16);     과 같은뜻이다.    
    int i;
    for(i=0; i<4++i){
        arr[i]=i;
    }
    for(i=0; i<4++i){
        printf("%d", arr[i]);
    }
free(arr);
    return 0;
}
cs

2. calloc

씨얼록, 또는 칼록, 또는 컬록이라고 읽는 이 calloc함수는 할당한 메모리의 값들을 0으로 초기화 시켜주는 역할을 한다. 

type *[포인터변수명]=calloc[size_t num, size_t size];

이때 malloc과 같이 리턴값은 void 포인터이다.

첫번째 인자 size_t num은 동적할당할 배열의 개수라고 이해하면 편하다.

두번째 인자 size_t size는 동적할당할 배열의 자료형 사이즈라고 이해하면 편하다.(sizeof()연산자를 이용하자.)

⚇예시

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int *arr=(int *)calloc(4,sizeof(int));
//  int *arr=(int *)calloc(4,4);     와 같은뜻이다.    
    int i;
    for(i=0; i<4++i){
        arr[i]=i;
    }
    for(i=0; i<4++i){
        printf("%d", arr[i]);
    }
free(arr);
    return 0;
}
cs

이 예시는 malloc의 예시와 비슷하다. 차이점은 arr[0]~arr[3]까지의 값들이 0으로 초기화되어있다는 것이다.


3. realloc

리얼록이라고 읽는 이 realloc함수는 이미 동적할당한 공간의 크기를 바꿔주는 함수이다.

realloc[void *memblock, size_t size]; 

첫번째 인자 void *memblock은 그냥 크기를 바꾸고싶은 배열명이라고 이해하면 된다.

두번째 인자 size_t size는 바꾸고 싶은 배열의 사이즈를 넣으면 된다.

⚇예시

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(){
    int *arr=(int *)malloc(sizeof(int)*10);
    int i;
    for(i=0; i<10++i){
        arr[i]=i;
    }
    realloc(arr,20);
    for(i=10; i<20++i){
        arr[i]=i;
    }
    for(i=0; i<20++i){
        printf("%d", arr[i]);
    }
    free(arr);
    return 0;
}
cs


4. free

항상 동적할당이 끝나면 free([동적할당한변수명]); 을 해주어야 한다.

이유는 메모리 할당이 끝났으니 다음을 위해 메모리를 비워놓고 가는 것이다.(필자는 동적할당을 풀어준다(free)의 개념으로 이해했다.)


반응형