코드 세그먼트:
컴파일러는 c언어 소스를 기계어로 된 명령문으로 번역해서 실행 파일을 만든다.
실행 파일이 실행되어 프로세스가 만들어지면 이 기계어 명령들은 프로세스의 '코드 세그먼트'에
복사되어 프로그램 실행에 사용된다.
데이터 세그먼트:
프로그램이 시작해서 끝날 떄까지 계속 사용되는 데이터는 '데이터 세그먼트'에 보관된다.
이 영역에 있는 데이터는 컴파일할 때 정해지며
c언어에서 사용한 문자열 상수나 전역 변수,static변수가 이 영역을 사용
스택 세그먼트:
스택 세그먼트는 프로그램 실행 중에 필요한 임시 데이터를 저장하는 데 사용하는 메모리 영역
함수가 호출될 떄 함수 안에 선언한 지역 변수가 이 영역에 할당된다.
지역 변수가 놓이는 스택과 동적으로 할당되는 메모리 공간인 힙으로 나뉜다
메모리 할당
데이터를 저장할 메모리 공간을 적절하게 나누는 작업
정적 메모리 할당
컴파일러가 코드를 기계어로 번역하는 시점에 변수를 저장할 메모리 위치를 배정하는 것을 메모리 할당이라함
실행되는 중간에 크기를 변경할 수 없는 메모리를 정적으로 할당된 메모리라고 합니다.
변수가 메모리에 유지되는 시간
전역 변수는 프로그램이 시작해서 종료할 때까지 할당 받은 메모리 상태를 계속 유지해야 하고,
프로그램이 실행되는 도중에는 새롭게 전역 변수를 추가하거나 삭제할 수 없습니다.
전역 변수를 저장하는 공간은 프로세스의 데이터 세그먼트에 별도로 마련되어 있다.
지역 변수는 함수가 호출될 떄 메모리에 할당되었다가 함수가 끝나면 메모리 할당이 해제된다.
따라서 함수의 호출과 종료가 반복될 떄마다 지역 변수의 메모리 할당과 해제 또한 반복됨
할당 받은 메모리 상태를 유지못하는 지역 변수는 스택 세그먼트에 할당된다
지역 변수는
현재 주소를 기억하기 위해서는 지역 변수의 개수만큼 추가 메모리가 더 필요하다.
메모리 할당과 해제가 반복되어 변수 주소가 계속 바뀌기 떄문.
메모리 낭비가 심하기에
int a,b,c,d; 처럼 하나의 메모리 그룹으로 관리할 수 있다.
d |
c |
b |
a |
int Test()
{
int a,b,c,d;
...
A();
}
A()
{
int e;
}
e (함수) |
d |
c |
b |
a |
c언어 동적 메모리 -3일차 첫 번째 (0) | 2022.12.07 |
---|---|
c언어 스택 -3일차 (2) | 2022.12.07 |
c언어 메모,정리 배열,포인터 -3일차 세 번째 (0) | 2022.12.07 |
c언어 메모,정리 배열,포인터 -3일차 두번째 (0) | 2022.12.07 |
c언어 메모, 정리 배열, 포인터-3일차 첫번째 (0) | 2022.12.07 |