1

C 標準では、共用体のメンバーのみが同じアドレスに格納されるため、一度にアクセスできるメンバーは 1 つだけであると規定されています。コンパイラは共用体のメンバーのストレージをオーバーレイするため、1 つのメンバーを変更すると値が変更されます。以前に他のメンバーのいずれかに格納されていた.したがって、以前に格納されたメンバーの値にアクセスしようとすると、値は無意味または未定義になります.今ここに私の質問があります:-

struct catalog_item
{
   int stock_number;
   double price;
   int item_type;
   union
     {
       struct
          {
            char title[TITLE_LEN+1];
            char author[AUTHOR_LEN+1];
            int num_pages;
          } book;
       struct
          {
            char design[DESIGN_LEN+1];
          } mug;
       struct
          {
            char design[DESIGN_LEN+1];
            int colors;
            int sizes;
          } shirt;
     } item;
} c;

今、次のことが行われた場合

strcpy(c.item.mug.design, "Butterfly");

次に、次の両方が同じ値を持ちます

printf("%s",c.item.mug.design);          //1

printf("%s",c.item.shirt.design);        //2

「2」の結果が未定義または無意味ではないのはなぜですか?

4

3 に答える 3

0

ユニオン内の 3 つの構造体は、同じメモリ領域を使用します。これらの構造体のうちの 2 つの "design" フィールドは、たまたま同じメモリ位置にあります。したがって、一方を書き込むと他方も書き込まれ、実際のアドレスは同じになります。

于 2013-09-02T15:43:19.437 に答える