//각 타입당 어떤식으로 주소가 저장되는가 알아보기
#include <stdio.h>
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
#include <stdio.h>
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int B = 0x9abcdef0;
char C;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("C의 주소 %p\n", &C);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
char C;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("C의 주소 %p\n", &C);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
결과
A의 주소 0xbffff848
B의 주소 0xbffff844
C의 주소 0xbffff843
D의 주소 0xbffff83c
main의 주소 0x8048400
printf의 주소 0x8048300
A의 주소 0xbffff848
B의 주소 0xbffff844
C의 주소 0xbffff843
D의 주소 0xbffff83c
main의 주소 0x8048400
printf의 주소 0x8048300
저장방식
int D 83c |
83d |
83e |
83f |
840 |
841 |
842 |
char C 843 |
int B 844 |
845 |
846 |
847 |
int A 848 |
849 |
850 |
851 |
우리 컴퓨터는 보통 32비트(4바이트) 운영체제이기 때문에 char 나머지 3바이트 부분은 int 타입이 4바이트이기 때문에 채우지 않고 건너뛰어 다음주소에 저장된다.
C와 D사이 short 타입 선언하게 되면?
#include <stdio.h>
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int B = 0x9abcdef0;
char C;
short E; //C와 D사이 short 타입 선언
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
char C;
short E; //C와 D사이 short 타입 선언
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
결과
A의 주소 0xbffff848
B의 주소 0xbffff844
C의 주소 0xbffff843
E의 주소 0xbffff840
D의 주소 0xbffff83c
main의 주소 0x8048400
printf의 주소 0x8048300
저장방식 A의 주소 0xbffff848
B의 주소 0xbffff844
C의 주소 0xbffff843
E의 주소 0xbffff840
D의 주소 0xbffff83c
main의 주소 0x8048400
printf의 주소 0x8048300
int D 83c |
83d |
83e |
83f |
short E 840 |
841 |
842 |
char C 843 |
int B 844 |
845 |
846 |
847 |
int A 848 |
849 |
850 |
851 |
short는 2바이트이기 때문에 빈공간을 최적화한다.
B와 C사이 short 타입 F를 선언하게 되면?
#include <stdio.h>
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int B = 0x9abcdef0;
short F; //B와 C사이 short 타입 F선언
char C;
short E;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("F의 주소 %p\n", &F);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
short F; //B와 C사이 short 타입 F선언
char C;
short E;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("F의 주소 %p\n", &F);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
결과
A의 주소 0xbffff848
B의 주소 0xbffff844
F의 주소 0xbffff842
C의 주소 0xbffff841
E의 주소 0xbffff83e
D의 주소 0xbffff838
main의 주소 0x8048400
printf의 주소 0x8048300
A의 주소 0xbffff848
B의 주소 0xbffff844
F의 주소 0xbffff842
C의 주소 0xbffff841
E의 주소 0xbffff83e
D의 주소 0xbffff838
main의 주소 0x8048400
printf의 주소 0x8048300
저장방식
int D 838 |
839 |
83a |
83b |
83c |
83d |
short E 83e |
83f |
840 |
char C 841 |
short F 842 |
843 |
int B 844 |
845 |
846 |
847 |
int A 848 |
849 |
850 |
851 |
B와 F사이 char 타입 G를 선언하게 되면?
#include <stdio.h>
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int main()
{
int A = 0x12345678; //4byte공간 stack 지정
int B = 0x9abcdef0;
char G;
short F;
char C;
short E;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("G의 주소 %p\n", &G);
printf("F의 주소 %p\n", &F);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
char G;
short F;
char C;
short E;
int D;
printf("A의 주소 %p\n", &A);
printf("B의 주소 %p\n", &B);
printf("G의 주소 %p\n", &G);
printf("F의 주소 %p\n", &F);
printf("C의 주소 %p\n", &C);
printf("E의 주소 %p\n", &E);
printf("D의 주소 %p\n", &D);
printf("main의 주소 %p\n", main); //함수도 주소가 있으며, &는 쓰지 않아도 된다.
printf("printf의 주소 %p\n", printf);
return 0;
}
결과
A의 주소 0xbffff848
B의 주소 0xbffff844
G의 주소 0xbffff843
F의 주소 0xbffff840
C의 주소 0xbffff83f
E의 주소 0xbffff83c
D의 주소 0xbffff838
main의 주소 0x8048400
printf의 주소 0x8048300
A의 주소 0xbffff848
B의 주소 0xbffff844
G의 주소 0xbffff843
F의 주소 0xbffff840
C의 주소 0xbffff83f
E의 주소 0xbffff83c
D의 주소 0xbffff838
main의 주소 0x8048400
printf의 주소 0x8048300
int D 838 |
839 |
83a |
83b |
short E 83c |
83d |
83e |
char C 83f |
short F 840 |
841 |
842 |
char G 843 |
int B 844 |
845 |
846 |
847 |
int A 848 |
849 |
850 |
851 |
중간에 83e 842 주소로 부터 채워지지 않는 이유는 버스의 최적화이기 때문이다.
*그러므로 스텍크기에 맞춰서 프로그램을 작성해야 효율적이다.