개요
프로그래밍 언어 : C언어
과제 수행 날짜 : 2020.09.04
과제 개요 : 변수들을 선언한 후, 메모리 주소를 분석하여 어떻게 변수들이 메모리에 할당되는지 확인
코드
#include <stdio.h>
char a = 10, b, c;
int d = 10, e, f;
char g[5];
main()
{
char h = 10, i, j;
int k = 10, l, m;
char n[5];
}
실제 주소
a의 주소 = 0x0074a000
|
b의 주소 = 0x0074a5b9 | c의 주소 = 0x0074a5b8 |
d의 주소 = 0x0074a004
|
e의 주소 = 0x0074a5b4 | f의 주소 = 0x0074a5b0 |
g[0]의 주소 = 0x0074a5a8 | g[1]의 주소 = 0x0074a5a9 | g[2]의 주소 = 0x0074a5b0 |
h의 주소 = 0x00b8fa0f | i의 주소 = 0x00b8a03 | j의 주소 = 0x00b8f9f7 |
k의 주소 = 0x00b8f9e8 | l의 주소 = 0x00b8f9dc | m의 주소 = 0x00b8f9d0 |
n[0]의 주소 = 0x00b8f9c0 | n[1]의 주소 = 0x00b8f9c1 | n[2]의 주소 = 0x00b8f9c2 |
상대 주소
a의 주소를 1000으로 두고 상대 주소를 계산했다.
a의 주소 = 1000 | b의 주소 = 2465 | c의 주소 = 2464 |
d의 주소 = 1004 | e의 주소 = 2460 | f의 주소 = 2456 |
g[0]의 주소 = 2448 | g[1]의 주소 = 2449 | g[2]의 주소 = 2450 |
h의 주소 = 3079 | i의 주소 = 3067 | j의 주소 = 3055 |
k의 주소 = 3040 | l의 주소 = 3028 | m의 주소 = 3016 |
n[0]의 주소 = 3000 | n[1]의 주소 = 3001 | n[2]의 주소 = 3002 |
메모리 맵
- 전역 변수
-> b, c, e, f의 경우 빈 공간 없이 붙어서 메모리에 할당됨을 알 수 있다. 프로그램을 보면 b, c, e, f의 순서대로 선언되었는데 메모리에 할당된 것은 f가 이들 중에서 가장 작은 번지에 할당되고 b가 가장 큰 번지에 할당되었음을 알 수 있다. 배열의 경우에는 요소들 사이에 빈 공간 없이 할당되었다.
- 지역변수
-> 변수들이 전부 붙어있지 않고 중간중간 빈 공간을 가지며 할당됨을 알 수 있다. 프로그램 상에서 가장 마지막 줄에 선언한 n이 가장 작은 번지에 할당되고, 가장 먼저 선언한 h가 가장 높은 번지에 할당되었다. 전역변수와 마찬가지로 배열의 요소들 사이에는 빈공간 없이 할당되었다.
정리
변수들의 메모리 주소를 확인해 본 결과, 전역 변수의 경우 초기값의 유무에 따라 저장되는 공간이 다르다는 것을 알 수 있다. 초기값이 있는 a와 d의 경우, 주소가 각각 0x0074a000과 0x0074a004로 근처에 할당되었고, 초기값이 없는 b, c, e, f, g의 경우도 마찬가지로 0x0074a5a8부터 시작하여 0x0074a5b9까지의 공간에 할당되었음을 알 수 있다.
지역변수의 경우, 초기값의 유무와 상관없이 메모리에 할당됨을 알 수 있다.
같은 전역 변수임에도 변수 간의 주소 차이가 많이 나는 이유는 초기값의 유무에 따라 저장되는 영역이 다르기 때문이다.
초기값이 있는 전역 변수의 경우 data 영역에 저장되고, 초기값이 없는 전역변수의 경우 bss 영역에 저장된다.
지역변수의 경우 stack 영역에 저장된다.
'프로젝트 & 과제 > 3학년' 카테고리의 다른 글
[C언어] 출력 프로그램의 변수공간 (0) | 2022.01.25 |
---|---|
[C언어] 한글 / 영어 / 숫자 / 특수문자 (0) | 2022.01.24 |
[센서] Lane detection (0) | 2022.01.22 |
[센서] 주차장 출차 시뮬레이션 2 (0) | 2022.01.21 |
[센서] 주차장 출차 시뮬레이션 (0) | 2022.01.20 |