コード:
#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
中にジャンク値が返されますか?
答えてください、派生クラス ポインタが基本クラス オブジェクトを指しているときに同じ問題が発生しました。
b
のアドレスが含まれているa
場合、逆参照b
中にジャンク値が返されますか?
まず、危険なキャストを使用して a をfloat
指しますが、別の type を指しているふりをしますint
。
次に、値を読み取り、未定義の動作をします。通常、両方の型が同じサイズの場合、浮動小数点数を表すビット パターンが得られますが、これはゴミのように見えます。
int
次に、その危険な値を指定子にprintf
一致する引数として渡します。これにより、より未定義の動作が発生します。ほとんどの場合、ランダムなメモリを値として解釈し、完全なガベージを生成します。%f
double
double
予想される浮動小数点値を取得したい場合は、正しい型にキャストバックする必要があります: *(float*)b
. 値をに変換する場合int
は、ポインターではなく、それを変換します: int b = (int)a;
。ここでのキャストは厳密には必要ありませんが、コンパイラによっては、暗黙的な変換によって情報が失われるという警告が表示される場合があります。
派生クラス ポインターが基本クラス オブジェクトを指しているときに、同じ問題が発生しました。
それは別の問題ですが、関連する問題です。繰り返しになりますが、ポインターが指す型について嘘をついているため、そのポインターを使用して間違ったオブジェクト型にアクセスしようとすると、未定義の動作が発生します。
おそらく、その状況についてより具体的な質問をして、危険なキャストが必要だと思う理由を説明していただければ、型システム内で目的を達成する方法についてアドバイスできるでしょう。
これを試して ...
#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;
}