2016-08-15 37 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之間的區別? –

相關問題