私が知っている、私はすでにそれを見たが、なぜこの未定義の動作がある私は、任意の良い説明を見つけることができませんでした:この厳密なエイリアシングはどのようにして未定義の動作ですか?
#include <stdio.h>
#include <stdint.h>
//Common union for both types
union float_int {
float f;
uint32_t i;
};
int main(void) {
union float_int fi;
//This should be problematic
uint32_t* i_ptr = (uint32_t *)&fi.f;
fi.f = 10.0f;
printf("%f : %u\r\n", fi.f, fi.i); //Prints: 10.000000 : 1092616192 which is OK
printf("%u\r\n", *i_ptr); //Prints: 1092616192 which is also OK
return 0;
}
我々はメモリ表現をチェックすると、両方が4-bytes
長いですので、何のメモリオーバーフローがではありませんポインティングまたは同様のもの。
この定義されていない動作はどうですか?
int main() {
union float_int fi;
void* v_ptr = &fi.f;
uint32_t* i_ptr = (uint32_t *)v_ptr;
}
このコードはまだ定義されていませんか?私はfloat
の番号をunsigned integer 32-bits
としています。
memcpy
を使用するのはなぜですか?
'indefined' - >' undefined'? –
@SouravGhoshはい、ありがとうございます。 – tilz0R
@Stargateurは私に正解をお願いします。私はそれを見つけることができませんでした。 – tilz0R