2013-01-08 73 views
2

我想知道,是否有可能通过structure2初始化structure1。 我也是新来的铸造的概念。 该代码的输出必须为零。请指导。谢谢!用另一种结构初始化结构,这可能吗?

#include<stdio.h> 

typedef struct student 
{ 
int roll_id[10]; 
int name_id[10]; 
int postn; 
} student; 

typedef struct exams 
{ 
int subject[10]; 
int area; 
}exams; 

int main() 
{ 
exams e= { {0} }; 
student *pptr= (student*)&e; 
printf (" %d\n", pptr->name_id[9]); 
return 0; 
} 

回答

2

比喻很简单:
你买了一个苹果和假装它是一个橘子。
只要你把它当作可食用的东西吃,你可以吃它,但如果你咬到它,希望得到橙汁,你最终会失望。

替换Apple &橙色由你的两个结构和你编译器。

结构不过是一块内存,通常是由不同的数据类型占用。
除了结构中的第一种类型之外,编译器实现可能会在这些类型之间添加padding bytes
由于您的两种结构的第一种类型是相同的(由10个整数组成的数组)。假设其他类型的结构examstudent可以工作,但如果您尝试访问除第一个类型以外的任何其他数据类型,将导致未定义行为

未定义行为是您在代码中获得的。

底线:
您不能这样做。

+0

我爱的答案! – Benoit

+0

谢谢你的详细解释,我讨厌这个底线:-) –

+0

@AlokSave这是一个有效的代码学生* pptr =(student *)&e;整个编译会成功吗? –

0

首先,在您的代码中,您不是通过structure2初始化structure1,而是仅仅将structure2的指针伪装为指向structure1的指针。

exams结构实例显然(更不用说奇怪的对齐设置)占用的内存比学生instance少。访问pptr->name_id[9]可以很好地导致通过e专用区域。现在这一切都取决于你的编译器,你的计算机等等。这意味着最好避免为了某个细节而深入研究这些细节。

这段代码的输出必须是零

也许是,如果你从未分配的堆栈区(过去e),并且在设置堆栈以零填充移交到前阅读正在运行的线程。

请在您的C书中阅读更多关于铸造和自动记忆以及实例和指针的信息。确实有这么多的东西来解决你的代码。在对这个主题进行了更多的研究之后,您最好提出更具体的问题。祝你好运