改变输出的struct声明顺序

时间:2012-04-01 04:27:16

标签: c procedural-programming

我无法理解这个程序的奇怪行为。我有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 个答案:

答案 0 :(得分:1)

结构的声明两次都应该是相同的,因为struct只是内存中数据的布局,你可以切换变量。

在您的情况下,函数func中的代码将尝试取消引用main函数中设置的整数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