그래서 당신은 너무 메모리에 배열을 가지고 :
이가 배열을 캐스팅 무엇
2, 23, 6, 7, 8...
2, 23, 6, 7, 8...
^
그런 다음, 4 바이트를 추가합니다 (다음 값으로 더 많은 그것을 통해 이동 : 개별 바이트에 접근하고, 여기에서 지적 할 수있는 char*
, 나중에).
2, 23, 6, 7, 8...
^
은 그럼이 코드를 잘못 세 가지 기술적 있습니다 (23)
값을 받고, int*
로 바뀌고을 역 참조.
제
는 그것이
unsigned
크기가 4 바이트 인 것으로 가정한다는 것이다. (따라서
+ 4
). 그러나 이것이 반드시 사실 일 필요는 없습니다!
unsigned
이 어떤 크기이든 상관없이 정확함을 보장하면
+ sizeof(unsigned)
이 좋을 것입니다.
두 번째 문제는 int
으로 캐스팅되었습니다. 원래 배열은 unsigned
이지만, 값은 int
으로 캐스팅됩니다. 배열의 값 중 하나가 int
(값이 INT_MAX
보다 큼)을 나타낼 수없는 경우 int
이 표시 할 수없는 unsigned
범위의 값이 있습니다 (범위의 반이 음수이므로 int
이 음수이므로) , 당신은 틀린 가치를 얻을 것입니다. 올바른 유형을 유지하려면 unsigned*
으로 변환하는 것이 더 낫습니다.
마지막 것은 형식 지정자입니다. 정수의 지정은 %d
이지만, 코드는 부호없는 정수에 대한 인 %u
를 사용합니다. 실제로, int*
다시 캐스팅에도 불구 것은 printf
그것은 무결성의 복원, unsigned*
로 다시 그 값을 캐스팅 것입니다 잘못이었다. 문제 2를 수정하면 문제 3이 수정됩니다.
는 숨겨진 네 번째 문제가 있습니다 : 코드는 안됐다. 이것은 학습 목적 일 수도 있지만 yuck입니다.
예, 오타되었습니다 : | –
GMan의 게시물을 읽은 후 스 니펫을 편집했습니다. –
감사합니다. :) 그것은 사람들을 혼란스럽게하고 우리가 준 응답을 무효로 만듭니다. 어떻게 모든 것이 합리적인지 계속해서 그래서 지나가는 사람은 질문에서 완전한 가치를 얻을 수 있었는지 질문을하십시오. 편집 : 훨씬 더. :) – GManNickG