본문 바로가기

Let's Study/Programming

초기화되지 않은 변수에 쓰레기값이 들어있는 이유

동아리방에서 이런 얘기가 오고가서 글을 올려봅니다.

printf로 초기화되지 않은 a의 값을 출력하는데 "쓰레기값이 왜 들어있는거에요?"


이건 printf 이전에 메모리할당으로 넘어갑니다.

 

 

 

변수를 선언하기 이전의 메모리 모습입니다.

여기엔 이상한 값들이 들어가있어요.

 

 

 

 

 

 

 

 

 

int형 a 변수를 선언했을 때의 메모리 모습입니다.

 

처음 a 변수를 선언했을 시, a의 앞으로 4바이트 뒤로 200바이트정도에 모두 cc값을 넣어서 스택을 할당합니다.

 

이 cc가 흔히 말하는 쓰레기값이죠.

 

 

 

 

 

 

 

 

 

 

보는 바와 같이 a 변수에 4를 초기화시켜서 a엔 4, 그 위로는 b의 값인 5가 들어갑니다.

나머지 cc cc cc cc, cc cc cc cc, cc cc cc cc 는 초기화되지 않은 변수 c, d, e로 들어가게 되는거죠.

 

결론은 이겁니다.

 

메모리에 변수가 할당되기 전엔 우리가 모르는 이상한 값이 들어가 있지만

변수를 선언함과 동시에 임의로 cc(우리가 알고 있는 쓰레기값)를 할당해줍니다.

 

그래서 printf로 c, d, e 를 출력해보면 임의로 들어있는 cc cc cc cc 값이 출력되는거고요.

 


cccccccc란 Magic debug value로, 자세한건 위키피디아에서 참조하세요.


 


Magic debug values : Magic debug values are specific values written to memory during allocation or deallocation, so that it will later be possible to tell whether or not they have become corrupted, and to make it obvious when values taken from uninitialized memory are being used

 

CCCCCCCC : Used by Microsoft's C++ debugging runtime library and many DOS environments to mark uninitialized stack memory.CC resembles the opcode of the INT 3 debug breakpoint interrupt on x86 processors


 

메모리 할당에 관련된건 포인터 공부를 하시면 자연스레 알게 됩니다. (감을 잡는 정도?)

 

예를 들어, int a ;를 선언하면 임의의 주소에 4바이트 a를 할당해줍니다.

a = 4; 정수 4를 할당된 a의 주소에 넣습니다.

 

 

 

그림으로 표현하자면 이런거죠.

한칸당 1바이트를 의미하고 int형이니 총 4바이트를 할당받았습니다.