用另一种结构初始化结构,这可能吗?

时间:2013-01-08 09:35:51

标签: c casting structure

我想知道,是否可以通过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 个答案:

答案 0 :(得分:2)

类比很简单:
你买了一个苹果, 假装 它是橙色的 只要你把它吃成可以食用的东西就可以吃它,但如果你咬它想要得到橙汁,你最终会失望的。

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

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

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

底线:
你不能做这个。

答案 1 :(得分:0)

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

显然,

exams结构实例(更不用说奇怪的对齐设置)占用的内存少于学生instance。访问pptr->name_id[9]很可能会导致阅读专用于e的区域。现在一切都取决于你的编译器,你的计算机等等......这意味着为了一个人的缘故,最好不要钻研这些细节。

  

此代码的输出必须为零

如果您正在读取未分配的堆栈区域(过去e)并且在您的设置堆栈中填充了零,然后将其移交给正在运行的线程,则可能就是这样。

请在您的C书中阅读有关投射和自动记忆以及实例和指针的更多信息。你的代码确实有很多东西需要说明。在对这个主题进行更多研究之后,最好再提出更具体的问题。祝你好运