Chapter 25. 메모리 관리와 메모리의 동적 할당

Slides:



Advertisements
Similar presentations
Part 03 상수, 변수, 자료형 ©우균, 창병모 © 우균, 창병모.
Advertisements

C 언어 (STS ) 10. Pointer Applications.
ㅎㅎ 구조체 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스 구조체 배열.
ㅎㅎ 구조체 C++ 프로그래밍 기초 : 객체지향의 시작 구조체 사용하기 함수 매개변수로서의 구조체 구조체 포인터와 레퍼런스
쉽게 풀어쓴 C언어 Express 제11장 포인터 C Express Slide 1 (of 27)
제 9 장 포인터.
2장. 프로그램의 기본 구성. 2장. 프로그램의 기본 구성 2-1"Hello, World!" 들여다 보기 /* Hello.c */ #include int main(void) { printf("Hello, World! \n"); return 0;
제14장 동적 메모리.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 07. 반복실행을 명령하는 반복문.
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
제 9 장 구조체와 공용체.
컴퓨터 프로그래밍 기초 [Final] 기말고사
-Part2- 제3장 포인터란 무엇인가.
자료 구조: Chapter 3 (2)구조체, 포인터
3장. 변수와 연산자. 3장. 변수와 연산자 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, / 3-1 연산자, 덧셈 연산자 연산자란 무엇인가? 연산을 요구할 때 사용되는 기호 ex : +, -, *, /
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 12. 포인터의 이해.
제 6장. 생성자와 소멸자 학기 프로그래밍언어및실습 (C++).
시스템 보안 [Buffer Overflow] DEC, 15, 2013 By 박동혁.
쉽게 풀어쓴 C언어 Express 제17장 동적메모리와 연결리스트 C Express Slide 1 (of 13)
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 01. 이것이 C언어다.
Chapter 10 Pointer Applications.
제 3장. C보다 나은 C++ II.
07. 디바이스 드라이버의 초기화와 종료 김진홍
C 프로그래밍.
Dynamic Memory and Linked List
11장. 포인터 01_ 포인터의 기본 02_ 포인터와 Const.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 24. 파일 입출력.
SqlParameter 클래스 선문 비트 18기 발표자 : 박성한.
컴퓨터 프로그래밍 기초 #02 : printf(), scanf()
Chapter 06. printf 함수와 scanf 함수 정리하기
23장. 구조체와 사용자 정의 자료형 2.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 03. 변수와 연산자.
MicroC/OS-II 3. Memory Management ITISN Technical Lab.
14장. 포인터와 함수에 대한 이해.
11장. 1차원 배열.
사용자 함수 사용하기 함수 함수 정의 프로그램에서 특정한 기능을 수행하도록 만든 하나의 단위 작업
13. 포인터와 배열! 함께 이해하기 IT응용시스템공학과 김 형 진 교수.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 21. 문자와 문자열 관련 함수.
컴퓨터 개론 및 실습 11. 동적 메모리 할당.
3장 상수 변수 기본 자료형 키워드와 식별자 상수와 변수 기본 자료형 형변환 자료형의 재정의.
메모리 관리 & 동적 할당.
쉽게 풀어쓴 C언어 Express 제14장 포인터 활용 C Express Slide 1 (of 22)
19. 함수 포인터와 void 포인터.
3장. 변수와 연산자 교안 : 전자정보통신 홈페이지 / 커뮤니티/ 학술세미나
Chapter6 : JVM과 메모리 6.1 JVM의 구조와 메모리 모델 6.2 프로그램 실행과 메모리 6.3 객체생성과 메모리
10장 부프로그램 구현 순천향대학교 컴퓨터공학과 하 상 호.
컴퓨터 프로그래밍 기초 - 10th : 포인터 및 구조체 -
2장. 변수와 타입.
컴퓨터 프로그래밍 기초 - 8th : 함수와 변수 / 배열 -
9장. C 언어의 핵심! 함수. 9장. C 언어의 핵심! 함수 9-1 함수의 정의와 선언 main 함수 다시 보기 : 함수의 기본 형태 { } 그림 9-1.
Canary value 스택 가드(Stack Guard).
Chapter 16. C++ 형 변환 연산자와 맺는 글
제 6 장 함수(functions).
Chapter 13. 템플릿(Template) 1
Chapter 15. 예외처리(Exception Handling)
Chapter 27. 파일의 분할과 헤더파일의 디자인
컴퓨터 프로그래밍 기초 - 9th : 배열 / 포인터 -
Summary of Pointers and Arrays
Numerical Analysis Programming using NRs
Chapter 12 파일 입출력.
윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 23. 구조체와 사용자 정의 자료형2.
Chapter 11 구조체.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 04. 클래스의 완성.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 05. 복사 생성자.
윤성우의 열혈 C++ 프로그래밍 윤성우 저 열혈강의 C++ 프로그래밍 개정판 Chapter 07. 상속의 이해.
Chapter 16. 메모리 동적 할당.
1. 지역변수와 전역변수 2. auto, register 3. static,extern 4. 도움말 사용법
개정판 누구나 즐기는 C언어 콘서트 제13장 동적 메모리 출처: pixabay.
13. 포인터와 배열! 함께 이해하기.
2019 2학기 9장 배열과 포인터 1. 주소, 주소연산자(&) 2. 포인터, 역참조연산자(*) 3. 배열과 포인터.
Presentation transcript:

Chapter 25. 메모리 관리와 메모리의 동적 할당 윤성우의 열혈 C 프로그래밍 윤성우 저 열혈강의 C 프로그래밍 개정판 Chapter 25. 메모리 관리와 메모리의 동적 할당

윤성우의 열혈 C 프로그래밍 Chapter 25-1. C언어의 메모리 구조 윤성우 저 열혈강의 C 프로그래밍 개정판

윤성우의 열혈 C 프로그래밍 메모리의 구성 메모리 공간을 나눠놓은 이유는 커다란 서랍장의 수납공간이 나뉘어 있는 이유와 유사하다. 메모리 공간을 나눠서 유사한 성향의 데이터를 묶어서 저장을 하면, 관리가 용이해지고 메모리의 접근속도가 향상된다.

메모리 영역별로 저장되는 데이터의 유형 윤성우의 열혈 C 프로그래밍 실행할 프로그램의 코드가 저장되는 메모리 공간. CPU는 코드 영역에 저장된 명령문을 하나씩 가져다가 실행 전역변수와 static 변수가 할당되는 영역. 프로그램 시작과 동시에 할당되어 종료 시까지 남아있는 특징의 변수가 저장되는 영역 프로그래머가 원하는 시점에 메모리 공간에 할당 및 소멸을 하기 위한 영역 지역변수와 매개변수가 할당되는 영역 함수를 빠져나가면 소멸되는 변수를 저장하는 영역

프로그램의 실행에 따른 메모리의 상태 변화1 윤성우의 열혈 C 프로그래밍 프로그램의 시작: 전역변수의 할당 및 초기화 실행의 흐름1

윤성우의 열혈 C 프로그래밍 프로그램의 실행에 따른 메모리의 상태 변화2 main 함수의 호출 및 실행 실행의 흐름2

윤성우의 열혈 C 프로그래밍 프로그램의 실행에 따른 메모리의 상태 변화3 fct 함수의 호출 실행의 흐름3

프로그램의 실행에 따른 메모리의 상태 변화4 윤성우의 열혈 C 프로그래밍 fct 함수의 반환 그리고 main 함수 이어서 실행 실행의 흐름4

윤성우의 열혈 C 프로그래밍 프로그램의 실행에 따른 메모리의 상태 변화5 fct 함수의 재호출 및 실행 실행의 흐름5

프로그램의 실행에 따른 메모리의 상태 변화6 윤성우의 열혈 C 프로그래밍 fct 함수의 반환 및 main 함수의 반환 실행의 흐름6 (프로그램 종료) 함수의 호출순서가 main → fct1 → fct2이라면 스택의 반환은(지역변수의 소멸은) 그의 역순인 fct2 → fct1 → main으로 이루어진다는 특징을 기억하자!

윤성우의 열혈 C 프로그래밍 Chapter 25-2. 메모리의 동적 할당 윤성우 저 열혈강의 C 프로그래밍 개정판

전역변수와 지역변수로 해결이 되지 않는 상황 윤성우의 열혈 C 프로그래밍 무엇을 반환하는가? 변수 name은 ReadUserName 함수호출 시 할당이 되어야 하고, ReadUserName 함수가 반환을 하더라도 계속해서 존재해야 한다. 그런데 전역변수도 지역변수도 이러한 유형에는 부합하지 않는다!

혹시 전역변수가 답이 된다고 생각하는가? 윤성우의 열혈 C 프로그래밍 전역변수는 답이 될 수 없음을 보이는 예제 및 실행결과

힙 영역의 메모리 공간 할당과 해제 윤성우의 열혈 C 프로그래밍 반환형이 void형 포인터임에 주목! malloc & free 함수 호출의 기본 모델

malloc 함수의 반환형이 void형 포인터인 이유 윤성우의 열혈 C 프로그래밍 malloc 함수의 반환형이 void형 포인터인 이유 void * ptr1 = malloc(sizeof(int)); void * ptr2 = malloc(sizeof(double)); void * ptr3 = malloc(sizeof(int)*7); void * ptr4 = malloc(sizeof(double)*9); void * ptr1 = malloc(4); void * ptr2 = malloc(8); void * ptr3 = malloc(28); void * ptr4 = malloc(72); malloc 함수의 일반적인 호출형태 sizeof 연산 이후 실질적인 malloc의 호출 malloc 함수는 인자로 숫자만 하나 전달받을 뿐이니 할당하는 메모리의 용도를 알지 못한다. 따라서 메모리의 포인터 형을 결정짓지 못한다. 따라서 다음과 곁이 형 변환의 과정을 거쳐서 할당된 메모리의 주소 값을 저장해야 한다. 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); malloc 함수의 가장 모범적인 호출형태

메모리 할당 실패 시 malloc 함수는 NULL을 반환 윤성우의 열혈 C 프로그래밍 힙 영역으로의 접근 메모리 할당 실패 시 malloc 함수는 NULL을 반환 이렇듯 힙 영역으로의 접근은 포인터를 통해서만 이뤄진다. 실행결과 ‘동적 할당’이라 하는 이유! 컴파일 시 할당에 필요한 메모리 공간이 계산되지 않고, 실행 시 할당에 필요한 메모리 공간이 계산되므로!

free 함수를 호출하지 않으면? 윤성우의 열혈 C 프로그래밍 • free 함수를 호출하지 않으면? 할당된 메모리 공간은 메모리라는 중요한 리소스를 계속 차지하게 된다. • free 함수를 호출하지 않으면 프로그램 종료 후에도 메모리를 차지하는가? 프로그램이 종료되면 프로그램 실행 시 할당된 모든 자원이 반환된다. • 꼭 free 함수를 호출해야 하는 이유는 무엇인가? fopen 함수와 쌍을 이루어 fclose 함수를 호출하는 것과 유사하다. • 예제에서 조차 늘 free 함수를 호출하는 이유는 습관을 들이기 위해서인가? 맞다! fopen, fclose가 늘 쌍을 이루듯 malloc, free도 쌍을 이루게 하자!

문자열 반환하는 함수를 정의하는 문제의 해결 윤성우의 열혈 C 프로그래밍 할당! ReadUserName 함수가 호출될 때마다 새로운 메모리 공간이 할당이 되고 이 메모리 공간은 함수를 빠져나간 후에도 소멸되지 않는다! 소멸! 실행결과

malloc, calloc, realloc 함수호출을 통해서 할당된 메모리 공간은 모두 free 함수호출을 통해서 해제한다. 윤성우의 열혈 C 프로그래밍 calloc & realloc malloc 함수와의 가장 큰 차이점은 메모리 할당을 위한 인자의 전달방식 elt_count  elt_size 크기의 바이트를 동적 할당한다. 즉, elt_size 크기의 블록을 elt_count의 수만큼 동적할당! 그리고 malloc 함수와 달리 모든 비트를 0으로 초기화! ptr이 가리키는 힙의 메모리 공간을 size의 크기로 늘리거나 줄인다! malloc, calloc, realloc 함수호출을 통해서 할당된 메모리 공간은 모두 free 함수호출을 통해서 해제한다.

새로운 공간을 마련해야 하는 경우에는 메모리의 복사과정이 추가됨에 주목! 윤성우의 열혈 C 프로그래밍 realloc 함수의 보충설명 • malloc 함수! 그리고 realloc 함수가 반환한 주소 값이 같은 경우  기존에 할당된 메모리 공간을 이어서 확장할 여력이 되는 경우 • malloc 함수! 그리고 realloc 함수가 반환한 주소 값이 다른 경우  기존에 할당된 메모리 공간을 이을 여력이 없어서 새로운 공간을 마련하는 경우 새로운 공간을 마련해야 하는 경우에는 메모리의 복사과정이 추가됨에 주목!

Chapter 25가 끝났습니다. 질문 있으신지요?