2013-06-11 2 views
1

플로트로 역 참조하려는 부호없는 바이트 배열에서받은 값이 있습니다. 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.

혼란 스러워요 - 제가 여기에 뭔가 빠졌습니까?

+0

기본적으로 deref가 맞습니다. 당신 printf ("% p", ptr); 어쩌면 4 바이트 정렬되지 않은 주소 (또는 적어도 2 바이트)가 있습니까? 일부 플랫폼에서는이 기능이 필요할 수 있습니다. 그리고 btw, (ptr-1)은 1 바이트 뒤로 (보통 uint8_t *이기 때문에)입니다. 보통 float-size로 돌아 가지 않습니다. – QSQ

+0

예, 이상한 일입니다. ptr - 1은 1 바이트 뒤로이므로 원래 코드 인 것처럼 보입니다 * (float *) ptr; 1 바이트를 찾고 ptr 대신 4 개의 float 바이트를 해석합니다. 내 요점은 디버거에서 코드가 멈추었을 때 * (float *) ptr이 런타임에 얻고 자하는 것을 제공하고 * (float *) (ptr-1)은 런타임에 실제로 얻은 것을 제공한다는 것입니다. – ace

+1

컴파일러가 제대로 정렬되지 않은 경우 ptr 값을 반올림하는 것일 수 있습니다. 보십시오 printf ("% p", ptr); 디버거에서 제공하는 것과 동일한 결과인지 확인하십시오 (dbg에서 포인터 자체를 인쇄하는 것). – QSQ

답변

2

기본적으로 deref가 맞습니다.

printf("%p", ptr); 4 바이트 정렬 (또는 적어도 2 바이트 정렬)되지 않은 주소가 있습니까? 이는 일부 플 '폼에서 필요할 수 있습니다.

테스트의 경우 실제 실수 값을 uint8_t *에 전달하십시오.

float f= 102.5; 
yourfunct((uint8_t*)&f); 

이 작동하는지 확인하십시오.

0
*(float*)(ptr - 1); 

ptr--; //move the pointer to point to charackter in front of the previous one 
*(float*)ptr; 

이 당신의 의도가 동일하다? 또는 ptr로 지정되는 값에서 1을 뺍니다.

+0

나는 그것을 빼고 싶지 않습니다.내가 말한 것은 런타임 중에 역 참조 (dereferencing) ptr이 마치 포인터를 역 참조 (dereferenced) 한 것처럼 동작한다는 것입니다. – ace

관련 문제