2

私は組合を持っています、わかりました。
この共用体は構造体の内部にあり、その共用体には名前が付けられていません (何か)。

typedef enum TYPES {INT, FLOAT, CHAR, POINTER TO FUNCTION /* Please pay attention on this */};

typedef struct {
    TYPES type;
    union {
        int integer;
        float real;
        char letter;
        char *string;
        /* here we have a pointer to function syntax but I don't remember how to write it right now*/
    }
} MY_STRUCT;

このように構造体を初期化します。

MY_STRUCT test = {INT, 22};

定義により、この種の初期化を使用すると、ユニオンの最初のフィールドが使用されるため、これが機能することはわかっています。
問題は
、初期化をこのように書くとどうなるかということです。

MY_STRUCT test = {INT, 22.2};

float値を取得しようとすると、正しい値が得られますか?

float var = (float)test.real;

これは正しいことを示しますか?
これはすべてのタイプで機能しますか?関数 1 へのポインタでさえ?

初期化によって値がユニオンの最初のフィールドに入れられるという定義により、floatがintよりも大きい場合に問題があるので、これを尋ねていますか? 私はこれを知らないので、関数へのポインターがintよりも大きい場合があることを知っているので、最初のメンバーとして関数へのポインターを使用して共用体を記述する必要がありますか?

GCC は型パニングをサポートしており、Linux カーネルでさえ型パニングを使用していると読みました。したがって、その構造体でこの種の初期化を使用でき、その後、正しい値を取得できるかどうかだけが心配です。

4

1 に答える 1

0

ユニオンの要素はメモリ空間を共有し、ユニオン全体が「最大の」要素に必要なスペースを使用します。22.2 で初期化すると。これは、fpoint IEEE 754 を使用して 01000001101100011001100110011010 で表されます。精度に依存します。そしてあなたの

float var=(float) test.real

初期化とこの行の間の和集合の要素を変更しない場合にのみ機能します。

于 2013-12-06T17:34:19.860 に答える