2012-04-01 65 views
0

我無法理解這個程序的怪異行爲。我有2個文件,在file1.c和file2.c中結構聲明的順序改變輸出

file.c是

#include <stdio.h>struct ll { 
int key; 
struct ll *next; 
}; 
extern void func(struct ll*); 

int main(void) 
{ 
struct ll l = { 1, &l }; 
printf("%d %d\n",l.key,l.next->key); 
func(&l); 
return 0; 
} 

和file2.c中是:

#include <stdio.h> 

struct ll 
{ 
struct ll *next;  
int key; 
}; 


void func(struct ll *l) 
{ 
    printf("%d \n",l->key); 
    printf("%d \n",l->next->key); 
} 

現在,當我編譯並運行它,它顯示分段故障。但是,如在file2.c中,如果我將struct ll替換爲:

struct ll 
{ 
int key; 
struct ll *next;  
}; 

然後它工作正常。我的意思是通過交換聲明的順序,它影響了輸出。

回答

1

結構的聲明應該兩次相同,因爲struct只是內存中的數據佈局,並且您切換變量。

在您的情況下,函數func中的代碼將嘗試解引用主函數中設置的整數1。 (或者做其他奇怪的事情,如int和指針是不兼容的)

file.c

struct ll: [ int (key) | pointer (next) ] 
struct ll l = { 1, &l }; // this causes: 
l:   [ 1   | &l    ] 

file2.c中

struct ll: [ pointer (next) | int (key) ] 
// so the passed struct is treated in the same way: 
l:   [ 1   | &l    ] 
       next   key 
+0

見我的編輯,希望它更清楚,如果沒有,我會嘗試更多。 – MByD 2012-04-01 04:34:15

+0

非常感謝:)。現在清楚了,看了編輯後的版本 – Jatin 2012-04-01 04:36:54

+0

在兩者之間,你從gcc的哪個參數中產生了這個輪廓? – Jatin 2012-04-01 04:49:37