728x90
반응형

첫 번째로는 이중 포인터에 대한 내용이었고 이번에는 메모리와 오버플로우에 대한 내용에 대해서 알아보았다.

 

메모리에는 스택, , 데이터, 텍스트 영역 등 다양한 영역으로 나눌 수 있다.

 

메모리 stack 영역지역 변수와 매개 변수가 저장되는 영역이다.
함수가 시작되면 해당 함수의 지역 변수가 스택에 쌓였다가 함수가 종료되면 자동으로 해제된다.

 

[ 스택 오버플로우가 발생하는 경우 ]

스택 오버플로우가 발생하는 경우에 대해서 대표적으로 재귀 함수에 대해서 알아보았다.
재귀함수라고 자기 자신의 함수를 호출해 가독성을 높여주는 함수다.
하지만 재귀함수를 잘못 사용하게 되면 stack overflow  발생시키게 된다.
함수를 호출할 때 함수의 파라미터와 리턴 값, 복귀 주소(RET) 등 stack 에 저장하게 된다.
하지만 재귀함수를 사용할 때 호출한 함수가 종료되지 않은 채 새로운 함수를 호출하게 되면
스택에 메모리가 계속해서 저장되게 되고 사용할 수 있는 메모리가 부족하게 된다.
결국 메모리가 부족하기 때문에 stack overflow 가 발생하게 된다.
해결 방법은 문제의 원인에서 말했듯이 함수를 호출할 때 이전의 함수를 종료시켜주어야 한다.

 


 

메모리 heap 영역빈 공간으로 메모리를 동적 할당해서 사용하는 영역이다.
c언어에서 대표적으로 malloc() 함수를 통해 메모리를 동적으로 할당하고 free() 함수를 통해 메모리를 해제해준다.
컴파일을 할 때 크기를 알 수 없고 프로그램이 실행될 때 메모리 크기가 할당된다.

 

[  오버플로우 발생하는 경우 ]

동적으로 메모리를 할당해서 사용하기 때문에 할당된 메모리의 공간이 정해져있다.
메모리를 사용할 수 있는 공간이 정해져있기 때문에 정해진 공간보다 많이 사용하게 되면 오버플로우가 발생하게 된다.
하지만 직접 코드를 작성해서 테스트해보면 알 수 있듯이 오버플로우가 발생하지만 결과는 제대로 나오는 것을 알 수 있었다.
따라서  오버플로우는 사용자가 직접 할당해주기 때문에 여러 명의 사용자의 프로그램이 실행되고 있다면
어떤 프로그램이  오버플로우를 발생시키는지 알기 어렵다.

 

추가적으로 stack 영역과 heap 영역의 차이점에 대해서도 알아보았다.
Stack은 할당될 메모리의 크기를 컴파일 과정에서 알 수 있지만
Heap은 컴파일 과정에서는 크기를 알 수 없고, 프로그램 실행시 크기가 결정된다.
Stack은 높은 주소에서 낮은 주소로 할당되지만 Heap은 낮은 주소에서 높은 주소로 할당된다.

728x90
반응형
복사했습니다!