我想知道,是否可以通过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;
}
答案 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书中阅读有关投射和自动记忆以及实例和指针的更多信息。你的代码确实有很多东西需要说明。在对这个主题进行更多研究之后,最好再提出更具体的问题。祝你好运