1.프로세스와 메모리 할당
2.지역 변수와 스택
3.동적 메모리 할당 및 해제
4.동적 메모리 사용하기
1.프로세스와 메모리 할당
프로그램 : c언어로 작성한 소스파일은 컴파일 작업과 링크작업을 거쳐서 기계어로 이루어진 실행파일(exe)이 된다.
CPU는 실행파일의 명령어를 실행할 수 없음!
프로세스(실행중인 프로그램) : 운영체제가 실행파일의 명령어를 읽어서 메모리에 재구성하게 된다.

코드 세그먼트 : 실팽파일 -> 프로세스가 될때 기계어들은 코드 세그먼트에 복사되어 프로그램 실행에 사용됨.
데이터 세그먼트 : 프로그램이 시작해서 끝날 때까지 계속 사용되는 데이터
스택 세그먼트 : 프로그램 실행 중에 필요한 임시 데이터를 저장하는 데 사용하는 메모리 영역이다. 함수가 호출될 때 함수 안에 선언한 지역 변수가 이 영역에 할당된다.
정적 메모리 할당
컴파일러가 C언어 소스 코드의 변수 선언 부분을 번역할 때, 데이터 세그먼트나 스택 세그먼트에 해당 변수를 저장할 메모리 영역을 배정한다.
이렇게 컴파일러가 코드를 기계어로 번역하는 시점에 변수를 저장할 메모리 위치를 배정하는 것을 정적 메모리 할당이라고 한다.
메모리 할당 기준이 C언어 코드가 기계어로 번역되는 시점에 결정되기 때문에 정적 할당된 메모리 크기나 개수를 변경하려면 코드를 변경하고 다시 컴파일 해야 한다.
즉, 프로그램이 실행될 때 메모리의 크기가 이미 결정되어 있으며, 실행되는 중간에 크기를 변경할 수 없는 메모리를 정적으로 할당된 메모리라고 한다.
변수가 메모리에서 유지되는 시간
전역변수 : 프로그램이 시작해서 종료할 때까지 할당 받은 메모리 상태를 계속 유지해야 한다.
(프로그램이 실행되는 도중에는 새롭게 전역변수를 추가 삭제 할 수 없음)
지역변수 : 함수가 호출될 때 메모리에 할당되었다가 함수가 끝나면 메모리 할당이 해제된다. 이처럼 할당 받은 메모리 상태를 유지하지 못하는 지역 변수는 프로세스의 스택 세그먼트에 메모리가 할당된다.

정적으로 할당된 메모리를 관리하는 법
아래 처럼 같은 함수에 선언하는 변수들이 순차적으로 메모리에 할당되기 때문에 그림처럼 하나의 메모리 그룹으로 관리 할 수 있다.

함수에 선언한 지역 변수를 하나의 메모리 그룹으로 관리할 수 있다는 것은 지역 변수의 개수에 상관없이 시작위치(start) 포인터와 끝 위치 (End) 포인터를 사용해 관리할 수 있다는 것을 의미한다.
End 포인터가 필요한 이유는 Test 함수가 A라는 함수를 호출한 경우에 A함수에 선언한 지역변수가 END 이후의 메모리 공간에 놓이기 때문이다.
즉, End는 다음에 호출될 함수의 메모리 시작 위치를 결정한다.

2.지역 변수와 스택
컴파일러가 처리해주는 작업이다.

스택에 데이터를 추가하면 스택 포인터가 가리키는 주소의 메모리에 대입된다.
스택 포인터의 주소는 4만큼 증가한다.
이 작업을 push 라고 한다.
데이터를 꺼낼 때는 가장 마지막에 추가된 값을 제거하고 스택 포인터 주소가 4만큼 감소한다.
이 작업을 pop이라고 한다.
참고: 실제로는 stack에 push가 될때 스택 포인터 주소가 감소된다.

컴파일러가 지역 변수를 저장할 메모리 공간을 확보하는 방법
컴파일러는 변수를 위한 메모리 공간을 확보하기 위해 ax 레지스터를 세 번 push 하는 코드를 기계어로 만든다.
이렇게 하면 프로그램이 실행될 때 push가 3번 수행되어 4바이트 크기의 메모리 공간 3개가 스택에 추가된다.
하지만 이 방법은 지역 변수가 많으면 많을 수록 push 코드와 pop 코드가 많아 진다.

sub 명령과 add 명령을 사용하는 방법
스택에 변수를 할당할 때 push 명령을 사용하면 스택 포인터에 저장된 주소가 4씩 감소한다.
하지만 스택 포인터에 저장된 주소는 기계어 명령으로 직접 변경할 수 있는 값이기 대문에 아래 처럼 뺄셈을 실행하는 sub 명령으로 스택 포인터 값에서 12를 빼도 된다.
이렇게 하면 베이스 포인터와 스택 포인터 주소 값의 차이가 12가 되면서 결과적으로 push 명령을 세 번 수행한 것과 같아진다.
'컴퓨터 기초 > C언어' 카테고리의 다른 글
| 동적 메모리 할당 및 해제 (0) | 2025.11.21 |
|---|---|
| [C언어]50일차 - 분리집합 트리(이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.21 |
| [C언어]49일차 - 수식트리 (이것이 c 자료구조와 알고리즘이다) (0) | 2025.11.20 |
| [C언어]48일차 - 배열과 포인터 (0) | 2025.11.19 |
| [C언어]47일차 - 재귀함수 정리 - feat.호출스택 (0) | 2025.11.17 |