첫 번째로는 이중 포인터에 대한 내용이었고 이번에는 메모리와 오버플로우에 대한 내용에 대해서 알아보았다.
메모리에는 스택, 힙, 데이터, 텍스트 영역 등 다양한 영역으로 나눌 수 있다.
메모리 stack 영역은 지역 변수와 매개 변수가 저장되는 영역이다.
함수가 시작되면 해당 함수의 지역 변수가 스택에 쌓였다가 함수가 종료되면 자동으로 해제된다.
[ 스택 오버플로우가 발생하는 경우 ]
스택 오버플로우가 발생하는 경우에 대해서 대표적으로 재귀 함수에 대해서 알아보았다.
재귀함수라고 자기 자신의 함수를 호출해 가독성을 높여주는 함수다.
하지만 재귀함수를 잘못 사용하게 되면 stack overflow 를 발생시키게 된다.
함수를 호출할 때 함수의 파라미터와 리턴 값, 복귀 주소(RET) 등 stack 에 저장하게 된다.
하지만 재귀함수를 사용할 때 호출한 함수가 종료되지 않은 채 새로운 함수를 호출하게 되면
스택에 메모리가 계속해서 저장되게 되고 사용할 수 있는 메모리가 부족하게 된다.
결국 메모리가 부족하기 때문에 stack overflow 가 발생하게 된다.
해결 방법은 문제의 원인에서 말했듯이 함수를 호출할 때 이전의 함수를 종료시켜주어야 한다.
메모리 heap 영역은 빈 공간으로 메모리를 동적 할당해서 사용하는 영역이다.
c언어에서 대표적으로 malloc() 함수를 통해 메모리를 동적으로 할당하고 free() 함수를 통해 메모리를 해제해준다.
컴파일을 할 때 크기를 알 수 없고 프로그램이 실행될 때 메모리 크기가 할당된다.
[ 힙 오버플로우가 발생하는 경우 ]
동적으로 메모리를 할당해서 사용하기 때문에 할당된 메모리의 공간이 정해져있다.
메모리를 사용할 수 있는 공간이 정해져있기 때문에 정해진 공간보다 많이 사용하게 되면 오버플로우가 발생하게 된다.
하지만 직접 코드를 작성해서 테스트해보면 알 수 있듯이 오버플로우가 발생하지만 결과는 제대로 나오는 것을 알 수 있었다.
따라서 힙 오버플로우는 사용자가 직접 할당해주기 때문에 여러 명의 사용자의 프로그램이 실행되고 있다면
어떤 프로그램이 힙 오버플로우를 발생시키는지 알기 어렵다.
추가적으로 stack 영역과 heap 영역의 차이점에 대해서도 알아보았다.
Stack은 할당될 메모리의 크기를 컴파일 과정에서 알 수 있지만
Heap은 컴파일 과정에서는 크기를 알 수 없고, 프로그램 실행시 크기가 결정된다.
Stack은 높은 주소에서 낮은 주소로 할당되지만 Heap은 낮은 주소에서 높은 주소로 할당된다.
'스터디&교육 > 부스트코스 CS50 2기' 카테고리의 다른 글
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(4) (0) | 2021.02.19 |
---|---|
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(3) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 5주차 심화 과정 💎 생각해보기(1) (0) | 2021.02.19 |
부스트코스(Boostcourse) CS50 4주차 심화 과정 💎 생각해보기 (0) | 2021.02.03 |
부스트코스(Boostcourse) CS50 3주차 심화 과정 💎 생각해보기 (0) | 2021.01.23 |