ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [열혈] 메모리 관리와 동적 할당
    프로그래밍/C언어 2017. 1. 4. 16:05

    메모리 공간 (by 운영체제)


    코드 영역(Code Area) : 프로그램 코드가 저장되는 공간. CPU는 프로그램을 실행시킬 때 이 영역에 저장된 명령어를 이용한다.

    데이터 영역(Data Area): 전역변수와 static으로 선언된 static 변수가 할당되는 곳.

    스택 영역(Stack Area): 지역변수, 매개변수 (함수가 종료될 때 소멸)가 할당되는 곳.

    힙 영역(Heap Area): 프로그래머가 원하는 시점에 할당하고 소멸시킬 수 있는 변수가 할당되는 곳.


    메모리의 동적할당


    전역변수와 지역변수로 해결되지 않는 상황


    지역변수의 한계

    코드 ReadStringFault1.c 

    #include <stdio.h>
    
    char * ReadUserName(void)
    {
        char name[30];
        printf("What is your name? ");
        gets(name);
        return name;
    }
    
    int main(void) 
    {
        char * name1;
        char * name2;
        name1 = ReadUserName();
        printf("name1: %s \n", name1);
        name2 = ReadUserName();
        printf("name2: %s \n", name2);
    
        return 0;
    }


    실행결과




    문제점!

    프로그램 사용자로부터 받는 문자열 배열이 지역적으로 선언되었기 때문에 함수를 빠져나오면 소멸된다.

    --> 실행하면 정상적인 결과 X



    전역변수의 한계

    코드 ReadStringFault2.c

    #include <stdio.h>
    char name[30];
    
    char * ReadUserName(void)
    {
        printf("What is your name? ");
        gets(name);
        return name;
    }
    
    int main(void) 
    {
        char * name1;
        char * name2;
        name1 = ReadUserName();
        printf("name1: %s \n", name1);
        name2 = ReadUserName();
        printf("name2: %s \n", name2);
    
        printf("name1: %s \n", name1);
        printf("name2: %s \n", name2);
        return 0;
    }
    



    실행결과


    문제점!

    하나의 전역변수를 사용하면 마지막으로 저장된 내용으로 덮어쓰게 된다.



    필요한 변수의 유형은??

    <함수가 호출될 때마다 새롭게 할당되고, 함수를 빠져나가도 소멸되지 않는 변수!>



    메모리 공간 할당과 해제: malloc과 free 함수


    힙 영역= '프로그래머가 관리하는 메모리 공간'

     -> 이 공간에 필요한 위의 유형의 변수를 할당한다.

    #include <stdio.h>
    void * malloc(size_T size);       // 힙 영역으로의 메모리 공간 할당
    void free(void * ptr);            // 힙 영역에 할당된 메모리 공간 해제


    malloc 함수의 반환형은 void형 포인터이므로, malloc 함수의 반환 값에 아무런 가공도 가하지 않으면 할당된 메모리 공간에 접근이 불가능하다.



    코드 DynamicMemoryAllocation.c  --> 빌드 오류가 생김. - 어디서 오류??

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)
    {
        int * ptr1 = (int *)malloc(sizeof(int));
        int * ptr2 = (int *)malloc(sizeof(int)*7);
        int i;
    
        *ptr1 = 20;
        for (i = 0; i < 7; i++)
            ptr2[i] = i + 1;
    
        printf("%d \n", *ptr1);
        for (i = 0; i < 7; i++)
            printf("%d ", ptr2[i]);
    
        free(ptr1);
        free(ptr2);
        return 0;
    }


    댓글

Designed by Tistory.