(unsigned int)(*(char *)(i + _ARR) - 48)
ida로 보고있는데 _ARR이 제가 입력한 문자가들어가는곳인데 앞에 (unsigned int)(*(char *) 이부분 뜻을 잘모르겠어요 입력한숫자가 0(48) 이면 그냥 48-48로 계산되는건가요??
*(char *)는 문자형 포인터(char *) 주소에서 한 문자를 읽어낸 다음 *(포인터), 즉 *(char *) 그것을 unsigned int로 변환해서 어딘가에 대입하겠다, 예를들어 printf() 등, 즉 unsigned(48) 라는 의미입니다.
(unsigned int)(...)는 사실 특별히 의미있는 표현은 아닌데, 특정 상황에서는 문제가 될 수도 있습니다. 아마 compiler warning을 피하기 붙였을 확률이 높습니다.
#include <stdio.h> int main() { int _ARR[] = {50, 60, 70 ,80}; printf( "_ARR : %ld \n", _ARR ); printf( "&_ARR[0] : %ld \n", &_ARR[0] ); printf( "(char*)_ARR : %ld \n", (char*)_ARR ); printf( "*(char*)(_ARR) : %ld \n", *(char*)(_ARR) ); printf( "*(char*)(_ARR) - 5 : %ld \n", *(char*)(_ARR) - 5 ); printf( "(unsigned int)*(char*)(_ARR) - 5 : %ld \n", (unsigned int)*(char*)(_ARR) - 5 ); printf( "(unsigned int)*(char*)(_ARR + 1) - 5 : %ld \n", (unsigned int)*(char*)(_ARR + 1) - 5 ); for( int i = 0; i < sizeof(_ARR) /sizeof(int); i++ ) printf("%d \n", (unsigned int)(*(char *)(i + _ARR) - 5) ); return 0; }
결과 ===
$ ./a.out _ARR : 140724297568688 &_ARR[0] : 140724297568688 (char*)_ARR : 140724297568688 *(char*)(_ARR) : 50 *(char*)(_ARR) - 5 : 45 (unsigned int)*(char*)(_ARR) - 5 : 45 (unsigned int)*(char*)(_ARR + 1) - 5 : 55 45 55 65 75
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
*(char *)는 문자형 포인터(char *)
*(char *)는 문자형 포인터(char *) 주소에서 한 문자를 읽어낸 다음 *(포인터), 즉 *(char *)
그것을 unsigned int로 변환해서 어딘가에 대입하겠다, 예를들어 printf() 등, 즉 unsigned(48)
라는 의미입니다.
(unsigned int)(...)는 사실 특별히 의미있는 표현은 아닌데, 특정 상황에서는 문제가 될 수도 있습니다.
아마 compiler warning을 피하기 붙였을 확률이 높습니다.
아마도
결과 ===
$ ./a.out
_ARR : 140724297568688
&_ARR[0] : 140724297568688
(char*)_ARR : 140724297568688
*(char*)(_ARR) : 50
*(char*)(_ARR) - 5 : 45
(unsigned int)*(char*)(_ARR) - 5 : 45
(unsigned int)*(char*)(_ARR + 1) - 5 : 55
45
55
65
75
댓글 달기