【发布时间】:2023-03-16 00:26:01
【问题描述】:
此代码 sn-p 打印值 5。我不明白为什么。
#include <stdio.h>
struct A
{
int x;
};
struct B
{
struct A a;
int y;
};
void printA(struct A *a)
{
printf("A obj: %d\n", a->x);
}
int main(void)
{
struct B b = {
{
5
},
10
};
struct A *a = (struct A*)&b;
printA(a);
printf("Done.\n");
return 0;
}
当我创建b 时,指向它的指针将指向数据{ {5}, 10 }。
当我将&b 转换为struct A* 时,我向编译器保证此struct A* 指向数据类型为int 的单个数据元素的结构。相反,我为它提供了一个指针,该指针指向数据类型为 struct A、int 的两个数据元素的结构。
即使第二个变量被忽略(因为struct A 只有一个数据成员),我仍然为其提供一个结构,其成员的数据类型为struct A,而不是int。
因此,当我将a 传递给printA 时,会执行a->x 行,本质上是要求访问a 的第一个数据元素。 a 的第一个数据元素是数据类型 struct A,这是由于 %d 需要一个数字而不是 struct A 而导致的类型不匹配。
这里到底发生了什么?
【问题讨论】:
-
struct A 只是内存中的一个 int。 struct B 只有 2 个整数(以及更复杂结构的任何填充)。你也可以
printf("%d", (int*) b)看到 5。