亲爱的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_var2 的地址中找到nest_str1的地址,这是嵌套结构 nest_str2 的结构变量。我尝试了以下代码,
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;
}
该计划编制了O.K.但输出并不是我的预期。我遇到了运行时错误。
Segmentation fault (core dumped)
现在我甚至不知道我的方法是否正确。所以我希望得到一些建议。我也担心我可能忽略了一些明显简单的解决方案。
我还想知道我们是否可以在下面给出的代码中访问 mem1 。
struct outer_str
{
struct nest_str1
{
int mem1;
};
}outer_var;
我提前感谢每一个人的时间和耐心。
答案 0 :(得分: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
的位置。
答案 1 :(得分: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;
}