Chinaunix首页 | 论坛 | 博客
  • 博客访问: 458498
  • 博文数量: 62
  • 博客积分: 1742
  • 博客等级: 中尉
  • 技术积分: 859
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-06 00:13
个人简介

这是一句很长很长而且又很啰嗦并且很无聊的废话...

文章分类

全部博文(62)

文章存档

2013年(1)

2012年(13)

2011年(48)

分类: C/C++

2011-05-15 22:23:44

   先贴点代码,后面再说明问题.
  1. #include <stdio.h>

  2. void god(int [3][2][2]);

  3. int main(void){
  4.     int i[3][2][2]={{{123,456},{789,101}},{{121,314},{151,617}},{{888,777},{999,333}}};
  5.     int (*p)[2][2]=i;
  6.     god(p);
  7.     return 0;
  8. }

  9. void god(int i[3][2][2]){
  10.     printf("%d\n",i[2][0][1]);
  11.     printf("%d\n",*(*(*(i+2))+1));
  12.     printf("%d\n",*(i+2)[0][1]);
  13. }
  1. .file "test.c"
  2. .text
  3. .globl main
  4. .type main, @function
  5. main:
  6. pushl %ebp
  7. movl %esp, %ebp
  8. andl $-16, %esp
  9. subl $80, %esp
  10. movl $123, 28(%esp)
  11. movl $456, 32(%esp)
  12. movl $789, 36(%esp)
  13. movl $101, 40(%esp)
  14. movl $121, 44(%esp)
  15. movl $314, 48(%esp)
  16. movl $151, 52(%esp)
  17. movl $617, 56(%esp)
  18. movl $888, 60(%esp)
  19. movl $777, 64(%esp)
  20. movl $999, 68(%esp)
  21. movl $333, 72(%esp)
  22. leal 28(%esp), %eax
  23. movl %eax, 76(%esp)
  24. movl 76(%esp), %eax
  25. movl %eax, (%esp)
  26. call god
  27. movl $0, %eax
  28. leave
  29. ret
  30. .size main, .-main
  31. .section .rodata
  32. .LC0:
  33. .string "%d\n"
  34. .text
  35. .globl god
  36. .type god, @function
  37. god:
  38. pushl %ebp
  39. movl %esp, %ebp
  40. subl $24, %esp
  41. movl 8(%ebp), %eax
  42. addl $32, %eax
  43. movl 4(%eax), %edx
  44. movl $.LC0, %eax
  45. movl %edx, 4(%esp)
  46. movl %eax, (%esp)
  47. call printf
  48. movl 8(%ebp), %eax
  49. addl $36, %eax
  50. movl (%eax), %edx
  51. movl $.LC0, %eax
  52. movl %edx, 4(%esp)
  53. movl %eax, (%esp)
  54. call printf
  55. movl 8(%ebp), %eax
  56. addl $40, %eax
  57. movl (%eax), %edx
  58. movl $.LC0, %eax
  59. movl %edx, 4(%esp)
  60. movl %eax, (%esp)
  61. call printf
  62. leave
  63. ret
  64. .size god, .-god
  65. .ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
  66. .section .note.GNU-stack,"",@progbits
  67. test.s

关键在于对应的3句打印结果的汇编,分别是:

printf("%d\n",i[2][0][1]); 对应着 addl $32, %eax 和 movl 4(%eax), %edx;

printf("%d\n",*(*(*(i+2))+1)); 对应着 addl $36, %eax 和 movl (%eax), %edx;

printf("%d\n",*(i+2)[0][1]); 对应着 movl 8(%ebp), %eax 和 addl $40, %eax;

然后他们打印出来的值顺序为:777 777 999

这说明一个问题,对数组操作,要么就都指针,要么就都下标,尽量避免这种组合型的.




阅读(1105) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

czysocket_dara2011-06-29 13:22:15

KBTiller: *(i+2)[0][1]:* *(*(i+2)+1):(i+2)[0][1][0]
和前两种确实不是一回事.....
是的,就是一个数组指针类型维数的问题.

KBTiller2011-06-28 21:00:25

*(i+2)[0][1]:* *(*(i+2)+1):(i+2)[0][1][0]
和前两种确实不是一回事

网络安全服务2011-05-16 16:31:08

看了```