본문 바로가기

C 언어/임베디드 C

메모리 저장주소 보기 및 활용

//각 타입당 어떤식으로 주소가 저장되는가 알아보기
#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;
}
결과
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 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;
}
결과
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 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;
}
결과
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 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;
}
결과
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 주소로 부터 채워지지 않는 이유는 버스의 최적화이기 때문이다.

*그러므로 스텍크기에 맞춰서 프로그램을 작성해야 효율적이다.

'C 언어 > 임베디드 C' 카테고리의 다른 글

달팽이 배열  (0) 2011.06.22
어셈블리 기본소스  (0) 2011.06.15
메모리내 주소 저장방식  (0) 2011.04.26
return문  (0) 2011.04.25
지역변수  (0) 2011.04.25