Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1755973
  • 博文数量: 335
  • 博客积分: 4690
  • 博客等级: 上校
  • 技术积分: 4341
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-08 21:38
个人简介

无聊之人--除了技术,还是技术,你懂得

文章分类

全部博文(335)

文章存档

2016年(29)

2015年(18)

2014年(7)

2013年(86)

2012年(90)

2011年(105)

分类: C/C++

2012-12-20 15:21:46

如果不运行程序,猜猜程序的运行结果?

  1. #include
  2. #include
  3. #include
  4. int main(int argc,char * argv[]){
  5. int i=0;
  6. int a[4];
  7. for ( i = 0 ; i <= 4; i++) {
  8. a[i] = 0;
  9. printf("#");
  10. }
  11. printf("the function reach here \r\n");
  12. exit(0);
  13. }
该程序由于数组越界,导致变量I的值被override,从而程序无限循环。
another

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. int main(int argc,char * argv[]){
  5.     int i=0;
  6.     short a[4];
  7.     for ( i = 0 ; i <= 4; i++) {
  8.         a[i] = 0;
  9.             printf("#");
  10.     }
  11.     printf("the function reach here \r\n");
  12.     exit(0);
  13. }
把上面的程序略微已修改,程序的结果又大不一样,同样是变量的值被override,但是考虑到系统的little-enedian 与big-endian的不同,运行的结果也不一样。
little-endian 下系统也是死循环
big-endian模式下程序可以运行。

点击(此处)折叠或打开

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>

  5. int foo(){
  6.     int a[4];
  7.     int i;
  8.     printf("*******function call******");
  9.     for ( i= 0; i <= 4;i++){
  10.         a[i]-=4;
  11.         printf("#");
  12.     }
  13.     printf("fun1 ");/* never reach here */
  14.     return 1; /* never reach here */
  15. }
  16. int main( int argc,char * argv[]){
  17.     foo();
  18.     printf("main reach here \r\n");
  19.     exit(0);
  20. }
这个程序自己测了一般,与预期的结果不服,虽然程序陷入了死循环但是不是预期那样,函数被无限调用,导致这种情况发生的原因是foo函数的栈格局与第一个程序的布局一样,从而导致程序虽然是死循环,但是原因不同
在VC下测了一把,程序运行正常
看来window &linux的栈的布局差异还是很大的,linux的栈的行为还是可以预测的,window知之甚少啊
程序是一个简单的函数调用,但是由于函数调用中用来保存函数返回地址的指针被数组赋值所override,导致函数被无限调用,从而陷入死循环---forever loop
从上面的例子,不难看出C要求程序猿对内存的布局要十分的熟悉,假定你对你所要操作的东西都是十分确定了,编译器不会为你做过多的检查~~~~~~~~~~~~~`



附上VC的调试错误:

点击(此处)折叠或打开

  1. 经过测试发现
  2. 在VC中编译c程序,在一个大括号括起的范围内,如果变量声明放在了函数调用的后面,那么编译的时候就会报错:
  3. syntax error : missing ';' before 'type'
  4. 然后你可以修改为把变量声明放在函数调用之前。就会顺利通过编译。
  5. 这个问题在vc编译c++程序,或者gcc编译c程序的时候都不会出现,仅仅在vc编译c程序的时候才会出现.
  6. http://blog.sina.com.cn/s/blog_517919ad0100nfa4.html

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