메모리 주소에 관한 질문입니다.
글쓴이: amblance / 작성시간: 금, 2010/12/31 - 8:14오후
공부하다가 모르는 것이 있어서 질문드립니다.
#include <stdio.h> int main(void) { char a; short b; int c; long d; float e; double f; unsigned int g; unsigned short h; printf("a : %x\n", (int)&a); printf("b : %x\n", (int)&b); printf("c : %x\n", (int)&c); printf("d : %x\n", (int)&d); printf("e : %x\n", (int)&e); printf("f : %x\n", (int)&f); printf("g : %x\n", (int)&g); printf("h : %x\n", (int)&h); return 0; }
다음과 같이 코드를 작성하였습니다.
그런데 결과를 확인하니,
bfd1633f
bfd1633c
bfd16334
bfd16330
bfd1632c
bfd16320
bfd16328
bfd1633a
다음과 같이 결과가 나왔습니다. 처음에 char의 첫 주소값이 bfd1633f인데 그다음 short의 첫 주소값이 bfd1633e가 나와야 하는것 아닌가요?
4byte로 메모리가 잡히는것 같은데... 너무 궁금합니다.
우분투에서 실행해보았습니다.
Forums:
...
short는 2바이트니까, b의 주소값이 bfd1633e가 나오면 bfd1633e, bfd1633f 두 바이트를 쓸 테니 a가 사용하는 번지를 덮어쓰겠죠.
그리고 자동변수가 스택에 잡히는 상대적 위치는 순전히 컴파일러 맘대로이니까 별로 큰 의미를 두시지 않는 게 좋습니다. 컴파일러 버전만 달라져도 값이 바뀔 수 있습니다.
이해가 잘 안됩니다.
bfd1633f[char]
bfd1633c[short]
bfd16334[int]
bfd16330[long]
---->
bfd1633f[char]
bfd1633e[short]
bfd1633c[int]
bfd16339[long]
이런식으로 차례대로 쌓이는것 아닌가요? 덮어쓴다는것이 무슨말씀이신지 이해가 잘 안됩니다.
바쁘실텐데 죄송합니다.
B(Birth) C(Choice) D(Death)
인생은 주어지는 것이 아니고 선택하는 대로 되는 것이다.
만약 주소값이 높은쪽에서 낮은 쪽으로 변수가 빈틈없이
만약 주소값이 높은쪽에서 낮은 쪽으로 변수가 빈틈없이 싸인다고 "가정"하면 아래처럼 쌓여야겠죠.
1바이트 char변수가 bfd1633f
2바이트 short가 bfd1633d~bfd1633e
4바이트 int가 bfd16339~bfd1633c
low <= (1234)(12)(1) =>high
말씀하신대로 bfd1633e에 short가 와버리면 bfd1633f까지도 short가 차지해야하니 char가 가지고 있던 bfd1633f와 겹쳐버리게 되니 말이 맞지 않겠죠?
게다가 실제 변수가 "빈틈없이" "순서대로" 메모리상에 쌓이지도 않을거에요.
댓글 달기