ABOUT ME

https://github.com/chongin12 chongin12@naver.com

Today
Yesterday
Total
  • (C언어) 12. 동적할당
    C언어 문서화 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)의 개념으로 이해했다.)


    반응형

    'C언어 문서화' 카테고리의 다른 글

    댓글

Designed by Tistory.