C 用另一个结构初始化该结构,这可能吗?
我想知道,是否可以通过structure2初始化structure1。 我对铸造的概念也很陌生。 此代码的输出必须为零。请导游。谢谢C 用另一个结构初始化该结构,这可能吗?,c,casting,structure,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() {
#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;
}
#包括
类型定义结构学生
{
int roll_id[10];
int name_id[10];
国际邮政;
}学生;
typedef结构检查
{
国际主题[10];
内部区域;
}考试;
int main()
{
考试e={{0};
学生*pptr=(学生*)&e;
printf(“%d\n”,pptr->name_id[9]);
返回0;
}
类比很简单:你买了一个苹果,假装它是桔子。
只要你把它当作可以吃的东西吃,你就可以吃,但如果你咬着吃,期望得到橙汁,你最终会失望的 用两种结构替换Apple&Orange,用编译器替换Apple&Orange 结构只不过是一块内存,通常被不同的数据类型占用。
编译器实现可以在这些类型之间添加,结构中的第一个类型除外。
因为两个结构的第一种类型是相同的(10个整数的数组)。假设结构
考试
为其他类型,学生
可以工作,但如果尝试访问除第一种类型以外的任何其他数据类型,将导致未定义的行为
未定义的行为是您在代码中得到的行为
底线:你不能这样做 首先,在您的代码中,并不是通过structure2初始化structure1,而是将指向structure2的指针伪装成指向structure1的指针
考试
结构实例(更不用说奇怪的对齐设置)占用的内存明显少于学生实例
。访问pptr->name\u id[9]
很可能导致读取超过e
专用区域。现在一切都取决于你的编译器,你的计算机等等。。也就是说,最好不要为了个人的利益而钻研这些细节
此代码的输出必须为零
如果您正在从未分配的堆栈区域(过去的e
)进行读取,并且在将堆栈移交给运行线程之前,在设置堆栈中填充了零,则可能是这样
请阅读C语言书中关于铸造和自动记忆、实例和指针的更多内容。要纠正您的代码,确实有很多东西要讲。在你对这个话题进行了更多的研究之后,你最好问一些更具体的问题。祝你好运我喜欢的答案!谢谢你的详细解释,我讨厌底线:-)@AlokSave它是有效代码吗student*pptr=(student*)&e;整个系统将成功编译,对吗?我喜欢苹果和橙色的比较。