免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1841 | 回复: 6
打印 上一主题 下一主题

[C] 请各位帮我分析一下这个GAS文件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-18 11:18 |只看该作者 |倒序浏览
都知道C中的数组要不给定大小,要不在堆中动态分配,而将变量作为数组长度是非法的,那么这么做到底会发生什么事情呢?我试了一下,源代码如下:

  1. //test.c
  2. void test()
  3. {
  4.     int a = 10;
  5.     int p[a];
  6.     p[3] = 2;
  7. }
复制代码

$gcc -S test.c
生成的test.s的片断

  1. test:
  2.         pushl   %ebp
  3.         movl    %esp, %ebp
  4.         subl    $24, %esp
  5.         movl    %esp, %eax
  6.         movl    %eax, %edx
  7.         movl    $10, -4(%ebp)
  8.         movl    -4(%ebp), %eax
  9.         sall    $2, %eax
  10.         addl    $15, %eax
  11.         addl    $15, %eax
  12.         shrl    $4, %eax
  13.         sall    $4, %eax
  14.         subl    %eax, %esp
  15.         movl    %esp, -20(%ebp)
  16.         movl    -20(%ebp), %eax
  17.         addl    $15, %eax
  18.         shrl    $4, %eax
  19.         sall    $4, %eax
  20.         movl    %eax, -20(%ebp)
  21.         movl    -20(%ebp), %eax
  22.         movl    %eax, -8(%ebp)
  23.         movl    -8(%ebp), %eax
  24.         movl    $2, 12(%eax)
  25.         movl    %edx, %esp
  26.         leave
  27.         ret
复制代码

编译器获得了栈中变量的值后,进行了一系列固定的算术操作(不以变量的值为改变),这么做究竟有什么意义呢?请各位帮我分析一下,谢谢!

论坛徽章:
0
2 [报告]
发表于 2009-03-18 12:16 |只看该作者
而将变量作为数组长度是非法的


很不幸,你的假定是错误的。

论坛徽章:
0
3 [报告]
发表于 2009-03-18 13:53 |只看该作者
引用楼上的话,“同学,你的教材该更新了”


C99支持变长数组

论坛徽章:
0
4 [报告]
发表于 2009-03-18 14:50 |只看该作者
原帖由 net_robber 于 2009-3-18 13:53 发表
引用楼上的话,“同学,你的教材该更新了”


C99支持变长数组


正确的说法!

论坛徽章:
0
5 [报告]
发表于 2009-03-21 00:07 |只看该作者
汗,我太火星了,谢谢楼上各位。。。

论坛徽章:
0
6 [报告]
发表于 2009-03-25 11:12 |只看该作者
原帖由 system888net 于 2009-3-18 14:50 发表


正确的说法!

很多编译器不支持吧

论坛徽章:
0
7 [报告]
发表于 2009-03-25 11:39 |只看该作者

回复 #6 honey709 的帖子

同学,你该更新你的编译器了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP