Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用另一个结构初始化该结构,这可能吗?_C_Casting_Structure - Fatal编程技术网

C 用另一个结构初始化该结构,这可能吗?

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() {

我想知道,是否可以通过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;
 }
#包括
类型定义结构学生
{
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;整个系统将成功编译,对吗?我喜欢苹果和橙色的比较。