struct变量名称的含义是什么?
换句话说,当我尝试代码时:
typedef struct enr
{
int a ;
char b ;
}enr ;
int main()
{
enr x ;
printf(" x = %d\n",x) ;
printf(" x.a = %d\n",x.a);
return 0 ;
}
对于 x 和 a.x ,我得到: 38 !所以我得到结构的第一个字段作为x的内容。
任何人都可以告诉我在一般情况下发生了什么(当第一个变量是数组,字符或其他东西时)?
答案 0 :(得分:4)
enr
永远不会在您的代码中初始化,因此a
和b
的值是在构造对象之前发生在内存中的任何内容。要解决此问题,请使用
enr x = {1, 'a'};
在这两种情况下你得到38,因为你的struct
是POD - 普通旧数据。因此,struct
除了int
和char
之外没有其他任何内容了。因为C ++不重新排序struct
元素,所以struct
x与其第一个元素x.a
在内存中的地址相同。所以,当你printf
时,你会打印出相同的内存。
请注意,通过printf(" x = %d\n",x)
打印结构类型(%d
)在技术上是未定义的行为(根据printf
的定义)。你得到的结果相同,因为enr
是一个POD,编译器可以用它来解决这个问题。
另一方面注意:在C ++中,struct
是一种命名类型。所以只需写struct enr {...}
即可;您使用的typedef
是旧的C风格。
答案 1 :(得分:2)
C在运行时不了解结构成员类型。但是告诉它"%d"
中printf
的类型是什么。它在x.a
打印整数的值不是因为a
被声明为整数,而是因为你告诉它。同样,没有成员的x
引用整个结构,但由于它的地址与其第一个成员的地址相同,并且你告诉它在那里寻找int
,它发现一。如果您的printfs
使用了"%f"
,那么它会打印一个浮点数,表示该地址中两个表达式的位。