#include <stdio.h>
int main()
{
int inum, *ip;
short *sp;
inum=0x0F5A0B43;
ip=&inum; // => ip=0012FF7C(inum의주소값)과 같다. 타입이 일치하는 순간에 ip에 주소값이 들어가게
된다.
printf("&inum: %x *ip: %p \n",&inum,*ip);
sp=(short*)ip;
printf("sp: %p, *sp: %x\n",sp,*sp);
sp++;
printf("sp: %p, *sp: %x\n",sp,*sp);
return 0;
}
*ip=100 명령문을 수행할때 컴퓨터가 심볼테이블을 기본으로 확인후 실행하게 된다.
우리가 쓸때에는 ip=&inum; 이지만 컴퓨터는 *0012FF78(ip의 주소값)=0012FF7C; 이런 식이된다.
sp=(short*)ip; 은 *0012FF80(sp의 주소값)=0012FF7C; 로 되는 것이다.
printf("sp: %p, *sp: %x\n",sp,*sp); // sp가 쇼트형이므로
저장된
중에서 2바이트인 43 0B를 출력하려고한다. 리틀앤디안 이기 때문에 실제 출력은
0B 43 이 나오게 된다.
Symbol Table
type |
name |
address |
값 |
int |
inum |
BFFFFA08 |
0F5A0B43 |
int* |
ip |
BFFFFA04 |
BFFFFA08 |
short* |
sp |
BFFFFA00 |
BFFFFA08 |
|
<---- 4바이트 ------> |
|
BFFFFA00 |
08 FA FF BF (저장방식 리틀앤디안) |
sp |
BFFFFA04 |
08 FA FF BF |
ip |
BFFFFA08 |
43 0B 5A 0F |
inum |
|
|
|
*sp 는 sp가 가리키는 곳을 출력 한다
sp=(short*)ip; //ip에 inum의 주소값이 들어있기때문에 sp=&inum; 이라고 할수 있다.
주소값이 0F 5A 0B 43 이므로 43 0B 5A 43 으로 저장된다. sp는 short* 이기 때문에 쇼트=2바이트
로 0B 43 으로 출력된다.
sp++;
printf("sp: %p, *sp: %x\n",sp,*sp);
sp는 short*이기 때문에 2바이트 증가한다.
sp는 BFFFFA08(inum)의 주소값이 저장되어 잇으므로 BFFFFA08에 +2 =>BFFFFA0A
가 되는것이다.
BFFFFA0A 에5A BFFFFA0B에 0F가 저장되 있으므로 *sp의 출력은 0F 5A 가 된다.
|