프로젝트 & 과제/3학년

[C언어] 변수의 메모리 할당 위치

qqlzzb 2022. 1. 23. 22:45

개요

프로그래밍 언어 : 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 영역에 저장된다.