본문 바로가기
Ghost의 Linux C Note(노트)/Ghost의 Linux C언어 실수 포인터

알면 알수록 Hell 타는 포인터? ...ㅠㅠ

by dark ghost 2012. 5. 8.
728x90
반응형

실수 형 포인터.

 

1. 위 소스는 실수를 포인터를 사용 하여 메모리에 어떻게 저장 되는 지를 확인해보기 위해 짠 소스이다. float fnum; 아래에 unshgned char *p = (unsigned char *) &fnum; 이 부분이 포인터를 사용한 부분이며 오른쪽이 (unsigned char *) &fnum; 이란 부분이 약간 뭔가 달라 보일 것이다. 이 부분이 형동등성을 위해 왼쪽의 포인터형 과 동등하게 만들어 주기 위해서 캐스팅을 한것이다. 그리고 fnum =32.125; 로 fnum을 초기화 시켜주고 그 아래에 *(p+0) = 0x00; 라는 부분이 나중에 출력 될때 메모리에 저장 되는 주소이다.

 

 2. tst 파일을 실행 시킨화면이다. fnum에서 입력 되었던 값이 메모리 주소를 입력하여 fnum의 값과 똑같이 나오는 것을 확인 할수 있다. 빨간 네모를 잘 확인하기 바란다. 맞게 출력이 됐는지 알수 없다고 생각을 할 수 있기 때문에 빨간 네모 부분 중에 42이라는 부분을 변경 하여 값이 어떻게 나오는지 확인을 해볼 것이다.

 

 3. 빨간 네모 안에 있던 메모리 주소 42를 52로 수정한 소스다. *(p+3) 는 포인터를 사용 하였는데 *(p)는 이 부분만 봤을 때는 p라는 곳을 따라 가라는 것 이다. 메모리 주소를 찾아 간다. 그리고 *(p + 3)는 p 라는 메모리 주소를 따라가 그 주소를 3 만큼 이동시킨다. 그 다음에 오른쪽 항에 메모리 주소 값을 *(p + 3)의 주소에 0x52값으로 넣겠다는 것이다. 그리고 다시 컴파일을 실행 시키고 파일을 실행 시켜보겠다.

 

4. tst를 실행 시켰더니 빨간 네모 부분 중에 맨 윗 부분이 137975824.... 라는 실수로 바껴 있는 것을 확인 할 수있다. 즉 변경 했던 메모리 주소가 잘못 입력을 하여서 결과 값이 32.125 가 안나오는 것이다.   

728x90
반응형

댓글