플로트로 역 참조하려는 부호없는 바이트 배열에서받은 값이 있습니다. ptr을 uint8_t *로 가져 와서 0,0,0xCD, 0x42 네 개의 값으로 이루어진 바이트 배열을 가리 킵니다 (이것은 리틀 엔디안 시스템입니다).Code Composer Studio에서 포인터를 역 참조
float val = *(float*)ptr;
내가 입력하면 -1.34e8
반환 할 수 있습니다 : 예상대로 코드의 해당 섹션에 브레이크 포인트 타격 후 식 창에서
*(float*)ptr;
를, 그것은 나에게 102.5를 제공합니다. 또한, 때 내가 입력 : 컴파일러가 PTR 사용하는 것처럼
*(float*)(ptr - 1);
나는 잘못된 -1.34e8를 얻을 - 대신 내가 입력 한 내용의 1.
혼란 스러워요 - 제가 여기에 뭔가 빠졌습니까?
기본적으로 deref가 맞습니다. 당신 printf ("% p", ptr); 어쩌면 4 바이트 정렬되지 않은 주소 (또는 적어도 2 바이트)가 있습니까? 일부 플랫폼에서는이 기능이 필요할 수 있습니다. 그리고 btw, (ptr-1)은 1 바이트 뒤로 (보통 uint8_t *이기 때문에)입니다. 보통 float-size로 돌아 가지 않습니다. – QSQ
예, 이상한 일입니다. ptr - 1은 1 바이트 뒤로이므로 원래 코드 인 것처럼 보입니다 * (float *) ptr; 1 바이트를 찾고 ptr 대신 4 개의 float 바이트를 해석합니다. 내 요점은 디버거에서 코드가 멈추었을 때 * (float *) ptr이 런타임에 얻고 자하는 것을 제공하고 * (float *) (ptr-1)은 런타임에 실제로 얻은 것을 제공한다는 것입니다. – ace
컴파일러가 제대로 정렬되지 않은 경우 ptr 값을 반올림하는 것일 수 있습니다. 보십시오 printf ("% p", ptr); 디버거에서 제공하는 것과 동일한 결과인지 확인하십시오 (dbg에서 포인터 자체를 인쇄하는 것). – QSQ