C 为什么打印结构变量会给出第一个元素的值?

C 为什么打印结构变量会给出第一个元素的值?,c,C,考虑以下代码: #include<stdio.h> struct s{ int i; } C; int main(){ C.i=8; printf("%u %u",C,C.i); } 为什么打印C会给出第一个元素的值?您不应该以任何方式依赖它,因为它是未定义的行为。%u格式说明符要求在传递结构C时使用类型为unsigned int的表达式。对于int类型,请使用%d或%i 结果是8,与任何其他对象一样,结构也是按值传递的。它只有一个成员,因此很可能与int类型的对象

考虑以下代码:

#include<stdio.h>

struct s{
  int i;
} C;

int main(){
  C.i=8;
  printf("%u %u",C,C.i);
}

为什么打印C会给出第一个元素的值?

您不应该以任何方式依赖它,因为它是未定义的行为。
%u
格式说明符要求在传递
结构C
时使用类型为
unsigned int
的表达式。对于
int
类型,请使用
%d
%i

结果是
8
,与任何其他对象一样,结构也是按值传递的。它只有一个成员,因此很可能与
int
类型的对象大小相同。换言之:

sizeof(int) == sizeof(struct C)

坚持住。
printf()
函数将struct对象解释为
unsigned int
,因此得到相同的数字。

您认为结构中的变量是如何布局的?通常是一个接一个。可能需要一些填充/对齐来优化内存访问,这取决于编译器。试着打印出
&C
及其属性的地址
&C.i
&C.j
,等等:)是的,结构的第一个成员也是结构本身的开始,因此打印结构的内容会返回其第一个成员的内容。我的问题是为什么打印C会给我第一个元素的值。我知道结构变量是如何存储在内存中的,但我不知道为什么打印C会给我第一个元素。我能把结构变量当作第一个元素的内存位置的别名吗。结构只允许您传递和处理多个内存块,而无需手动处理其中的每个内存块。对于未定义的行为,这是正确的。同样在C++(非C)中使用STD::CUT会发出直接错误,编译失败。如果设置了-Wformat标志,您实际上应该从编译器中得到一条警告消息:
警告:格式“%u”要求参数类型为“unsigned int”,但参数2的类型为“s”[-Wformat]
如果我在结构中声明int和char会发生什么。sizeof(int)@user5174296:可能更糟,因为大小不同。很可能它会在显示后续参数时崩溃。别这样,没错。我刚刚尝试添加另一个属性
float f;int i。然后
C.f=3.0;C.i=8;printf(“%f、%f、%d”、C、C.f、C.i”)输出
3.0000000.0000001077936128
sizeof(int) == sizeof(struct C)