프로그래밍/C언어

[열혈] 메모리 관리와 동적 할당

LinZBe4hia 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;
}