소멸 C 언어의 메모리 구조 프로그램의 실행에 따른 메모리의 상태 변화

Download Report

Transcript 소멸 C 언어의 메모리 구조 프로그램의 실행에 따른 메모리의 상태 변화

“Dynamic Allocation”
Introduction
 C언어의 메모리 구조
 메모리의 동적 할당
2
C언어의 메모리 구조
 메모리의 구성
• 운영체제에 의해 할당된 메모리 공간
코드 영역
(Code Area)
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
3
C언어의 메모리 구조
 메모리 영역별로 저장되는 데이터 유형
• 코드 영역(Code Area)
– 실행할 프로그램의 코드가 저장되는
메모리 공간
– CPU는 코드 영역에 저장된 명령문들을
하나씩 가져가서 실행을 한다.
코드 영역
(Code Area)
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
4
C언어의 메모리 구조
 메모리 영역별로 저장되는 데이터 유형
• 데이터 영역(Data Area)
– 전역변수와 static으로 선언되는 static 변수가
할당
– 프로그램의 시작과 동시에
메모리 공간에 할당되어
프로그램 종료 시까지 남아있게 된다.
코드 영역
(Code Area)
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
5
C언어의 메모리 구조
 메모리 영역별로 저장되는 데이터 유형
• 스택 영역(Stack Area)
– 지역변수와 매개변수가 할당
– 이 영역에 할당되는 변수들은
선언된 함수를 빠져나가면 소멸된다.
코드 영역
(Code Area)
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
6
C언어의 메모리 구조
 메모리 영역별로 저장되는 데이터 유형
• 힙 영역(Heap Area)
– C언어에서는 프로그래머가 원하는 시점에
변수를 할당하고 또 소멸하도록 지원
– 이러한 유형의 변수들이 할당되는 영역
– Dynamic Allocation
코드 영역
(Code Area)
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
7
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
8
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
전역변수의 할당
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
9
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
10
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
지역변수의 할당
num1=10
스택 영역
(Stack Area)
11
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
num1=10
스택 영역
(Stack Area)
12
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0; 함수 호출
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
num1=10
스택 영역
(Stack Area)
13
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
매개변수
n=10
num1=10
스택 영역
(Stack Area)
14
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
지역변수
num2=12
n=10
num1=10
스택 영역
(Stack Area)
15
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
num2=12
n=10
num1=10
스택 영역
(Stack Area)
16
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
소멸
num2=12
n=10
num1=10
스택 영역
(Stack Area)
17
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
소멸
void fct(int n)
{
int num2=12;
}
n=10
num1=10
스택 영역
(Stack Area)
18
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
변수 값 증가
num1=11
스택 영역
(Stack Area)
19
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
함수 호출
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
num1=11
스택 영역
(Stack Area)
20
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
매개변수
n=11
num1=11
스택 영역
(Stack Area)
21
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
지역변수
num2=12
n=11
num1=11
스택 영역
(Stack Area)
22
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
소멸
num2=12
n=11
num1=11
스택 영역
(Stack Area)
23
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
데이터 영역
(Data Area)
힙 영역
(Heap Area)
프로그램 종료
num1=11
스택 영역
(Stack Area)
24
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
sum=25
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
데이터 영역
(Data Area)
힙 영역
(Heap Area)
소멸
num1=11
스택 영역
(Stack Area)
25
C언어의 메모리 구조
 프로그램의 실행에 따른 메모리의 상태 변화
int sum=25;
int main(void)
{
int num1=10;
fct(num1);
num1++;
fct(num1);
return 0;
}
void fct(int n)
{
int num2=12;
}
sum=25
소멸
데이터 영역
(Data Area)
힙 영역
(Heap Area)
스택 영역
(Stack Area)
26
메모리의 동적 할당
 전역변수로 해결이 되지 않는 상황
27
메모리의 동적 할당
 전역변수로 해결이 되지 않는 상황
28
메모리의 동적 할당
 힙 영역의 메모리 공간 할당과 해제: malloc과 free 함수
Definition
#include <stdlib.h>
void * malloc(size_t size);
void free(void * ptr);
// 힙 영역으로의 메모리 공간 할당
// 힙 영역에 할당된 메모리 공간 해제
→ malloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환
29
메모리의 동적 할당
 힙 영역의 메모리 공간 할당과 해제: malloc과 free 함수
Example
int main(void)
{
void * ptr1 = malloc(4);
// 4바이트가 힙 영역에 할당
void * ptr2 = malloc(12); // 12바이트가 힙 영역에 할당
︙
free(ptr1);
// ptr1이 가리키는 4바이트 메모리 공간 해제
free(ptr2);
// ptr2가 가리키는 12바이트 메모리 공간 해제
︙
}
• 힙에 할당된 메모리 공간은 포인터 변수를 이용해서 접근하는
방법밖에 없다
30
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
Example 1
void * ptr = malloc(sizeof(int)); // int형 변수 크기의 메모리 공간 할당
*ptr=20;
// ptr이 void형 포인터이므로 컴파일 에러
31
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
Example 2
void * ptr1 = malloc(sizeof(int));
void * ptr2 = malloc(sizeof(double));
void * ptr3 = malloc(sizeof(int)*7);
void * ptr4 = malloc(sizeof(double)*9);
// int형 변수 크기의 메모리 공간 할당
// double형 변수 크기의 메모리 공간 할당
// 길이가 7인 int형 배열로 사용할 공간 마련
// 길이가 9인 double형 배열로 사용할 공간 마련
32
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
Example 2
void * ptr1 = malloc(sizeof(int));
void * ptr2 = malloc(sizeof(double));
void * ptr3 = malloc(sizeof(int)*7);
void * ptr4 = malloc(sizeof(double)*9);
// int형 변수 크기의 메모리 공간 할당
// double형 변수 크기의 메모리 공간 할당
// 길이가 7인 int형 배열로 사용할 공간 마련
// 길이가 9인 double형 배열로 사용할 공간 마련
void * ptr1 = malloc(4);
void * ptr2 = malloc(8);
void * ptr3 = malloc(28);
void * ptr4 = malloc(72);
33
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
Example 2
void * ptr1 = malloc(sizeof(int));
void * ptr2 = malloc(sizeof(double));
void * ptr3 = malloc(sizeof(int)*7);
void * ptr4 = malloc(sizeof(double)*9);
// int형 변수 크기의 메모리 공간 할당
// double형 변수 크기의 메모리 공간 할당
// 길이가 7인 int형 배열로 사용할 공간 마련
// 길이가 9인 double형 배열로 사용할 공간 마련
void * ptr1 = malloc(4);
void * ptr2 = malloc(8);
void * ptr3 = malloc(28);
void * ptr4 = malloc(72);
34
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
Example 2
void * ptr1 = malloc(sizeof(int));
void * ptr2 = malloc(sizeof(double));
void * ptr3 = malloc(sizeof(int)*7);
void * ptr4 = malloc(sizeof(double)*9);
// int형 변수 크기의 메모리 공간 할당
// double형 변수 크기의 메모리 공간 할당
// 길이가 7인 int형 배열로 사용할 공간 마련
// 길이가 9인 double형 배열로 사용할 공간 마련
void * ptr1 = malloc(4);
void * ptr2 = malloc(8);
void * ptr3 = malloc(28);
void * ptr4 = malloc(72);
int * ptr1 = (int *)malloc(sizeof(int));
double * ptr2 = (double *)malloc(sizeof(double));
int * ptr3 = (int *)malloc(sizeof(int)*7);
double * ptr4 = (double *)malloc(sizeof(double)*9);
35
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
36
메모리의 동적 할당
 malloc 함수의 반환형이 void형 포인터인 이유와
힙 영역으로의 접근
37
메모리의 동적 할당
 free 함수를 호출하지 않으면 프로그램 종료 후에도
메모리가 남게 되는가?
• 프로그램 실행 시 할당된 모든 메모리 공간은 프로그램이
종료되면 운영체제에 의해서 전부 해제가 된다.
 free 함수를 호출할 필요가 없는가?
• 앞으로 구현하게 될 프로그램은 간단히 실행되고 종료되는
프로그램이 아니다. 그러므로 free 함수를 꼭 호출하여 할당된
메모리를 해제하여야 한다.
38
메모리의 동적 할당
 문자열을 반환하는 함수를 정의하는 문제의 해결
39
메모리의 동적 할당
 문자열을 반환하는 함수를 정의하는 문제의 해결
40
메모리의 동적 할당
 malloc 함수의 사촌 뻘 되는 calloc 함수
Definition
#include <stdlib.h>
void * calloc(size_t elt_count, size_t elt_size);
→ 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환
• malloc 함수는 할당된 메모리 공간을 별도의 값으로 초기화하지
않지만, calloc 함수는 할당된 메모리 공간의 모든 비트를 0으로
초기화시킨다.
41
메모리의 동적 할당
 malloc 함수의 사촌 뻘 되는 calloc 함수
Example
int * ptr1 = (int *)malloc(sizeof(int));
double * ptr2 = (double *)malloc(sizeof(double));
int * ptr3 = (int *)malloc(sizeof(int)*7);
double * ptr4 = (double *)malloc(sizeof(double)*9);
int * ptr1 = (int *)calloc(1, sizeof(int));
double * ptr2 = (double *)calloc(1, sizeof(double));
int * ptr3 = (int *)calloc(7, sizeof(int));
double * ptr4 = (double *)calloc(9, sizeof(double));
• calloc 함수의 호출로 할당된 메모리 공간의 해제는 free 함수를
사용한다.
42