Soft Ware/C 언어!!

메모리 접근 및 캐스팅 문제 !!!

달려가보자 2011. 10. 3. 22:13
#include <stdio.h>
double d = 3.14;
struct test
{
int a;
double *d;
}x={100,&d};

struct test*func(void)
{
return &x;
}
void my_test(char a, ...)
{
printf("%f\n",**(double**)((unsigned char*)&a+4));
printf("%f\n",*(*(struct test**)((unsigned char*)&a+8))->d);
printf("%f\n",  *((*((struct test* (**) (void))(&a+12)))()->d)) ;
}
void main(void)
{
 my_test('A',&d,&x,func);
}

함수가 호출 되고 매개변수들은 지역변수 임으로 스택에 차곡차곡 채워집니다.

이때 매개변수들은 오른쪽에서 부터 변수들이 메모리공간에 채워지죠. 

이때 그래서 char a 의 주소가 맨 마지막에 쌓이게 되는거죠 

32비트에 체제에서는 프로세서가 빨리 수행하기 위해서 4바이트씩 처리합니다 그러므로서 메모리가

4바이트씩 채워지죠 +.+ 

그래서 스택을 4씩증가하고 주소값을 이용하여 접근해야되는데 주소값을 넘을려면 포인터가 필요하죠 

당연히 원하는 형으로 캐스팅 해줘야 됩니다. 

여기서 팁 원하는 형으로 캐스팅 해주고 그값을 담을려고 합니다. 그 주소값에 담긴것은 무엇일까요?? 

바로 주소값이 또 담겨 있는것입니다. 메모리에 저장된 그 주소값으로 접근해야 우리가 원하는 값이

출력 되는것입니다. 그러므로 더블 포인터를 쓴 이유죠 +.+