2

親愛なるstackoverflowの愛好家、

まず第一に、私はstackoverflowの初心者であるため、犯した間違いについては事前にお詫び申し上げます。

これは一種の C パズルです。または少なくとも私はそれに戸惑いました。コードを以下に示します。

struct outer_str
{
  struct nest_str1
  {
     int mem1;
  };
  struct nest_str2
  {
     int mem2;
  }nest_var2;
}outer_var;

int main()
{
   outer_var.nest_var2.mem2 = 111;
   printf("\n\nThe value of mem2 is %d\n\n",outer_var.nest_var2.mem2);

   // Statement to assign mem1 of nest_str1 with a value say 333;
   // Statement to print the value of mem1 of nest_str1;

   return 0;
}

コメントが示唆しているように、ネストされた構造体nest_str1のメンバー変数mem1にアクセスする必要があります。また、ネストされた構造体 Nest_str1 に対して宣言された構造体変数がないことに注意してください。

希望に逆らって、C++を少し模倣して、次のコードを試しました。

outer_var.nest_str1.mem1=333;

GCC 4.6.3 を使用してプログラムをコンパイルすると、次のエラーが表示されました。

"struct outer_str has no member named 'nest_str1' ".

そこで、ネストされた構造体nest_str2の構造体変数であるNest_var2のアドレスから、 Nest_str1 のアドレスを見つけることを考えました。私は次のコードを試しました、

int main()
{
 int offset;
 struct nest_str1 * addr; 
 offset=sizeof(int); // There is only one integer mem1 in nest_str1
 addr=(struct nest_str1 *)((int *) & (outer_var.nest_var2) - offset);
 addr->mem1=333;
 printf("\n\nThe value of mem1 is %d\n\n",addr->mem1);
 return 0;
}

プログラムは正常にコンパイルされましたが、出力は期待したものではありませんでした。実行時エラーが発生しました。

Segmentation fault (core dumped)

今では、自分のアプローチが正しかったかどうかさえわかりません。そこで、いくつかの提案を期待しています。また、明らかに単純な解決策を見落としていたのではないかと心配しています。

また、以下のコードでmem1にアクセスできるかどうかも知りたいです。

struct outer_str
{

  struct nest_str1
  {
     int mem1;
  };

}outer_var;

皆さんの時間と忍耐に感謝します。

4

2 に答える 2

2

outer_varアクセスを許可するのメンバーはありません (宣言していないため、というmem1を定義しただけです)。nest_str1

これを次のように変更します。

struct outer_str
{

  struct nest_str1
  {
     int mem1;
  } nest_var1;  // now there is a member!

}outer_var;

次のことができるようになりました。

outer_var.nest_var1.mem1 = 100;

あなたの試みは単純に間違っています。 のストレージがないためmem1、コードが機能したとしても、mem2.

于 2013-03-12T15:53:51.983 に答える