-7

コード:

#include <stdio.h>
int main()
{
  float a = 12.01;
  int *b = (int *)&a;
  printf("%p\n%p\n%f\n",&a,b,*b);
  return 0; 
}

bのアドレスが含まれているa場合、逆参照b中にジャンク値が返されますか?

答えてください、派生クラス ポインタが基本クラス オブジェクトを指しているときに同じ問題が発生しました。

4

2 に答える 2

2

bのアドレスが含まれているa場合、逆参照b中にジャンク値が返されますか?

まず、危険なキャストを使用して a をfloat指しますが、別の type を指しているふりをしますint

次に、値を読み取り、未定義の動作をします。通常、両方の型が同じサイズの場合、浮動小数点数を表すビット パターンが得られますが、これはゴミのように見えます。

int次に、その危険な値を指定子にprintf一致する引数として渡します。これにより、より未定義の動作が発生します。ほとんどの場合、ランダムなメモリを値として解釈し、完全なガベージを生成します。%fdoubledouble

予想される浮動小数点値を取得したい場合は、正しい型にキャストバックする必要があります: *(float*)b. をに変換する場合intは、ポインターではなく、それを変換します: int b = (int)a;。ここでのキャストは厳密には必要ありませんが、コンパイラによっては、暗黙的な変換によって情報が失われるという警告が表示される場合があります。

派生クラス ポインターが基本クラス オブジェクトを指しているときに、同じ問題が発生しました。

それは別の問題ですが、関連する問題です。繰り返しになりますが、ポインターが指す型について嘘をついているため、そのポインターを使用して間違ったオブジェクト型にアクセスしようとすると、未定義の動作が発生します。

おそらく、その状況についてより具体的な質問をして、危険なキャストが必要だと思う理由を説明していただければ、型システム内で目的を達成する方法についてアドバイスできるでしょう。

于 2013-09-05T07:24:59.610 に答える
-1

これを試して ...

#include <stdio.h>

int main()
{
 float a = 12.01;
 void *b = (int *)&a;
 printf("%p\n%p\n%f\n",&a,b,*(float *)b);
 return 0; 
}
于 2013-09-05T07:35:39.827 に答える