struct变量名称的含义是什么?

时间:2016-08-15 16:14:08

标签: c++ c

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的内容。

任何人都可以告诉我在一般情况下发生了什么(当第一个变量是数组,字符或其他东西时)

2 个答案:

答案 0 :(得分:4)

enr永远不会在您的代码中初始化,因此ab的值是在构造对象之前发生在内存中的任何内容。要解决此问题,请使用

enr x = {1, 'a'};

在这两种情况下你得到38,因为你的struct是POD - 普通旧数据。因此,struct除了intchar之外没有其他任何内容了。因为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",那么它会打印一个浮点数,表示该地址中两个表达式的位。