소멸 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