2017-03-22 32 views
-2

如果我有一个数组,例如:结构与阵列:打印第一个值

int v[10] 

,我尝试打印仅“V”,我会看到在阵列的存储位置。

但是,如果我有一个结构

struct mystruct{ 
    int x; 
    int y; 
}S; 

,我尝试只打印“S”,我会看到x的值,即该结构的第一个成员,而不是地址。
为什么?谢谢。

---编辑---
我打印一个简单的printf。
对不起,我的无知,但它是一个好奇...

+0

你怎么_print_是不是一个惊喜? –

+0

请发布显示问题的[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

提供代码。你打算如何只打印'v'和'S'?你期望看到什么值? –

回答

1

因为结构和数组是非常不同的。在表达式中使用时,数组会衰减到指向其第一个元素的指针,所以如果尝试将其作为int打印,则会将数组第一个元素的地址转换为int。

另一方面,struct是一个真正的类型,struct的地址就是它的第一个元素的地址。例如,一个函数可以返回一个结构体,但返回一个数组是非法的。当您尝试以int形式打印结构时,将结构的地址传递给printf函数并结束打印结构的第一个元素。

但是,所有上述仅是一个C语言实现的结果(OK所有常见实施的行为在这里是相同的),因为根据标准,通过别的不是整数作为%x格式的%dprintf参数给出未定义的结果。

TL/DR:所观察到的结果,只要你知道C语言和共同实现

+0

尽管根据标准,这显然是UB,即用“%d”打印结构的“值”,但它几乎看起来像必须工作,因为“struct”的地址保证是地址第一个成员,在这种情况下是'int'。 –

+1

@DavidBowling:UB不会阻止实现给出预期的结果......它对于可移植性的观点来说很重要,因为它意识到它只是偶然地工作*。特别是,标准为实现提供了对指向int的指针和指向struct的指针的不同表示。在这种情况下,使用'%d'打印结构体的值可能会导致打印其第一个(int)成员的完全不同的输出。 –

+0

我并不是在暗示这实际上是可移植的;只是试图想象会造成问题的情况。我忘记了不同的指针表示的可能性。这只是强调为什么我们应该认真对待UB,而不是猜测我们认为必须在幕后发生的事情!谢谢回复 :) –