[C] Stack / Heap
스택 메모리에는 지역변수, 인자, 리턴 값 등이 있다고 배웠다.
스택 메모리에서는 변수의 선언 위치에 따라 생성/제거 시기가 정해지지만, 힙 메모리에서는 개발자 마음대로 쓰고 버릴 수 있다.
마치 전역변수처럼, 한 번 선언해두면 여러 함수에서 함께 사용할 수 있지만, 전역변수와는 달리 다 썼다 싶으면 제거할 수도 있다.
스택 / 힙 메모리 구조는 C뿐만 아니라 거의 모든 프로그래밍 언어에서 공통되는 요소이다.
자바를 예로 들면, A a = new A(); 코드를 실행하면, new 연산자가 힙 메모리에 공간을 확보한 후 동적 변수를 만든다.
그러고 나서, 동적 변수에 OID(Object Identifier)를 붙여주고 new연산자는 A의 생성자를 실행한 후 OID를 리턴한다.
오른쪽 그림에서 그래프 형태는 객체 내에서 다른 객체를 변수로 가지고 있을 수 있음을 보여준다.
그래프를 보면, 절대 접근할 수 없는 요소들도 보이는데, 이는 JVM의 Garbage Collection을 통해 처리한다.
힙 메모리에 어떤 요소가 있고, 스택 메모리에 어떤 요소가 있는지 잘 알아두자.
Java에서 new연산자가 있다면, C에서는 malloc이 있다.
자바에서는 new연산자를 호출할 때 클래스 이름과 생성자의 인자를 통해 컴파일러가 클래스를 찾아 운영체제에게 메모리를 할당받고, C에서는 바이트 수를 통해 메모리를 할당받는다.
C에서는 리턴값이 메모리 조각이기 때문에, 얼마만큼 읽어낼 지 형변환을 통해 명시해줘야 활용할 수 있다. (기본값은 * void)
스택 메모리의 변수의 주소값을 변수에 할당하는 예시와, 힙 메모리의 변수의 주소값을 변수에 할당하는 예시이다.
malloc을 통해 변수에 메모리를 동적으로 할당받은 후, 꼭 free를 통해 변수를 삭제해 주자.
자바에서는 가비지컬렉터가 알아서 삭제해 줬지만, C에서는 그렇지 않다. 효율적인 메모리 관리를 위해 삭제하자.
그런데, malloc을 통해 메모리를 요청할 때 모종의 문제로 인해 힙 메모리에 확보되지 않으면 어떻게 될까?
이 경우, malloc은 NULL을 리턴한다. (null pointer)
이 점을 이용해 malloc이 NULL을 받았을 경우를 따로 처리해 줌으로써 안전한 프로그램을 만들어야 한다.
'Programming Language > C' 카테고리의 다른 글
[C] 구조체 (0) | 2022.05.26 |
---|---|
[C] 동적 메모리 (0) | 2022.05.23 |
[C] 배열 포인터 / 포인터 배열 정리 (0) | 2022.05.11 |
[C] 배열의 포인터 (0) | 2022.05.01 |
[C] 이중 포인터 (0) | 2022.05.01 |
댓글
이 글 공유하기
다른 글
-
[C] 구조체
[C] 구조체
2022.05.26 -
[C] 동적 메모리
[C] 동적 메모리
2022.05.23 -
[C] 배열 포인터 / 포인터 배열 정리
[C] 배열 포인터 / 포인터 배열 정리
2022.05.11 -
[C] 배열의 포인터
[C] 배열의 포인터
2022.05.01