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 回答
0

你写的代码是绝对正确的。但是,在从第二个嵌套结构“outer_var.nest_var2”中减去“偏移”值时,尽管将其类型转换为 (int ),但只需将其类型转换为 (char ) 即“addr=(struct nest_str1 *)((char *) & ( outer_var.nest_var2) - (char *)offset);" 您将能够在第一个结构中填充变量。

#include<stdio.h>
#include<stdlib.h>

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

int main()
{
    int offset;
    struct nest_str1 * addr;
    offset=sizeof(int); // There is only one integer mem1 in nest_str1
    addr=(struct nest_str1 *)((char *) & (outer_var.nest_var2) - (char          *)offset);
    addr->mem1=333;
    printf("\n\nThe value of mem1 is %d\n\n",addr->mem1);
    return 0;
}
于 2016-08-11T02:25:53.880 回答