2013-01-08 110 views
2

我想知道,是否有可能通過structure2初始化structure1。 我也是新來的鑄造的概念。 該代碼的輸出必須爲零。請指導。謝謝!用另一種結構初始化結構,這可能嗎?

#include<stdio.h> 

typedef struct student 
{ 
int roll_id[10]; 
int name_id[10]; 
int postn; 
} student; 

typedef struct exams 
{ 
int subject[10]; 
int area; 
}exams; 

int main() 
{ 
exams e= { {0} }; 
student *pptr= (student*)&e; 
printf (" %d\n", pptr->name_id[9]); 
return 0; 
} 

回答

2

比喻很簡單:
你買了一個蘋果和假裝它是一個橘子。
只要你把它當作可食用的東西吃,你可以吃它,但如果你咬到它,希望得到橙汁,你最終會失望。

替換Apple &橙色由你的兩個結構和你編譯器。

結構不過是一塊內存,通常是由不同的數據類型佔用。
除了結構中的第一種類型之外,編譯器實現可能會在這些類型之間添加padding bytes
由於您的兩種結構的第一種類型是相同的(由10個整數組成的數組)。假設其他類型的結構examstudent可以工作,但如果您嘗試訪問除第一個類型以外的任何其他數據類型,將導致未定義行爲

未定義行爲是您在代碼中獲得的。

底線:
您不能這樣做。

+0

我愛的答案! – Benoit

+0

謝謝你的詳細解釋,我討厭這個底線:-) –

+0

@AlokSave這是一個有效的代碼學生* pptr =(student *)&e;整個編譯會成功嗎? –

0

首先,在您的代碼中,您不是通過structure2初始化structure1,而是僅僅將structure2的指針僞裝爲指向structure1的指針。

exams結構實例顯然(更不用說奇怪的對齊設置)佔用的內存比學生instance少。訪問pptr->name_id[9]可以很好地導致通過e專用區域。現在這一切都取決於你的編譯器,你的計算機等等。這意味着最好避免爲了某個細節而深入研究這些細節。

這段代碼的輸出必須是零

也許是,如果你從未分配的堆棧區(過去e),並且在設置堆棧以零填充移交到前閱讀正在運行的線程。

請在您的C書中閱讀更多關於鑄造和自動記憶以及實例和指針的信息。確實有這麼多的東西來解決你的代碼。在對這個主題進行了更多的研究之後,您最好提出更具體的問題。祝你好運