2012-04-01 23 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