2016-08-15 136 views
-3

结构变量的名字是什么意思?结构变量的名称是什么意思?

换句话说,当我试图代码:

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

我得到:为Xa.x两个!所以我得到结构的第一个字段作为x的内容。

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

+7

没有C/C++这样的东西,请选择你需要哪种语言的答案。 – Slava

+8

没有'a.x',你的意思是'x.a'?请提供一个_working example_而不是一些不会重现该问题的伪代码。 – tkausl

+7

您调用*未定义的行为*将具有错误类型的数据传递给'printf()'。另一个*未定义的行为*将被调用以使用具有自动存储持续时间的未初始化变量的值,这是不确定的,如果您正在使用C. – MikeCAT

回答

4

enr永远不会在您的代码中初始化,所以ab的值是在构造对象之前在内存中发生的任何事情。为了解决这个问题,使用

enr x = {1, 'a'}; 

您在这两种情况下得到38,因为你struct是一个POD - 普通的旧数据。因此,除了intchar在一起,没有什么比你更多的是struct。由于C++不重新订购struct元素,因此struct x与其第一个元素x.a位于内存中的相同地址。所以当你printf他们,你打印的内存相同。

请注意,通过%d打印结构类型(printf(" x = %d\n",x))在技术上是未定义的行为(定义为printf)。你在这里得到相同的结果,因为enr是一个POD,编译器可以以某种方式解决这个问题。

另一方面说明:在C++中,一个struct是一个命名类型。所以只写struct enr {...}就足够了;你使用的typedef是一个古老的C风格。

+0

因此,对于定义如上的enr,两个语句都会打印出1? – mdewit

+1

@mdewit它仍然是未定义的行为,因为'x'不是'int'。 – NathanOliver

+0

@mdewit是的,[class.mem] .13 –

2

C在运行时不知道结构成员类型。但你告诉它是什么类型与"%d"在你的printf。它不是因为a被声明为一个整数,而是因为你告诉它的,所以在x.a处打印整数的值。同样,没有成员的x指的是整个结构,但由于其地址与其第一个成员的地址相同,并且您告诉它在那里寻找int,所以找到了一个。如果您的printfs已使用"%f",则它将打印由该地址处的两个表达式表示的浮点数。

+0

很高兴提及除了打印'x.a'外所有这些都是未定义的行为。 – NathanOliver

+0

确实如此,但许多这样的未定义的行为实际上在真实世界的编译器中是非常可预测的。 –

+0

但为什么当我改变第一个成员的类型时,我有x和x.a之间的区别? –

相关问题