18.5 嵌套结构

如果一个结构体里定义了另一个结构体会怎么样?

  1. #include <stdio.h>
  2. struct inner_struct
  3. {
  4. int a;
  5. int b;
  6. };
  7. struct outer_struct
  8. {
  9. char a;
  10. int b;
  11. struct inner_struct c;
  12. char d;
  13. int e;
  14. };
  15. void f(struct outer_struct s)
  16. {
  17. printf ("a=%d; b=%d; c.a=%d; c.b=%d; d=%d; e=%d", s.a, s.b, s.c.a, s.c.b, s.d, s.e);
  18. };

在这个例子里,我们把inner_struct放到了outer_struct的abde中间。 让我们在MSVC 2010中编译:

清单18.18: MSVC 2010

  1. _s$ = 8 ; size = 24
  2. _f PROC
  3. push ebp
  4. mov ebp, esp
  5. mov eax, DWORD PTR _s$[ebp+20] ; e
  6. push eax
  7. movsx ecx, BYTE PTR _s$[ebp+16] ; d
  8. push ecx
  9. mov edx, DWORD PTR _s$[ebp+12] ; c.b
  10. push edx
  11. mov eax, DWORD PTR _s$[ebp+8] ; c.a
  12. push eax
  13. mov ecx, DWORD PTR _s$[ebp+4] ; b
  14. push ecx
  15. movsx edx, BYTE PTR _s$[ebp] ;a
  16. push edx
  17. push OFFSET $SG2466
  18. call _printf
  19. add esp, 28 ; 0000001cH
  20. pop ebp
  21. ret 0
  22. _f ENDP

一个令我们好奇的事情是,看看这个反汇编代码,我们甚至不知道它的体内有另一个结构体!因此,我们可以说,嵌套的结构体,最终都会转化为线性的或者一维的结构。 当然,如果我们把struct inner_struct c;换成struct inner_struct *c(因此这里其实是定义个了一个指针),这个情况下状况则会大为不同。