2

我想知道,是否可以通过结构2初始化结构1。我对铸造的概念也很陌生。此代码的输出必须为零。请指导。谢谢!

#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;
 }
4

2 回答 2

2

类比很简单:
你买了一个苹果,然后假装它是一个橙子。
只要你把它当作可吃的东西吃,你就可以吃它,但如果你咬着它期待得到橙汁,你最终会失望的。

用你的两个结构和你的编译器替换 Apple & Orange。

结构只不过是一块内存,通常被不同的数据类型占用。
编译器实现可以在这些类型之间添加填充字节,结构中的第一种类型除外。
由于您的两种结构的第一种类型是相同的(10 个整数的数组)。将结构伪装exam成其他类型student会起作用,但如果您尝试访问第一种类型以外的任何其他数据类型,则会导致Undefined Behavior

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

底线:
你不能这样做。

于 2013-01-08T09:39:37.433 回答
0

首先,在您的代码中,您不是通过结构2 初始化结构1,而只是将结构2 的指针伪装成结构1 的指针。

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

此代码的输出必须为零

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

请在您的 C 书籍中阅读更多关于强制转换和自动记忆以及实例和指针的内容。要纠正您的代码,确实有很多事情要说。在您对该主题进行更多研究之后,您最好提出更具体的问题。祝你好运

于 2013-01-08T10:02:32.620 回答