如果不运行程序,猜猜程序的运行结果?
- #include
- #include
- #include
- int main(int argc,char * argv[]){
- int i=0;
- int a[4];
- for ( i = 0 ; i <= 4; i++) {
- a[i] = 0;
- printf("#");
- }
- printf("the function reach here \r\n");
- exit(0);
- }
该程序由于数组越界,导致变量I的值被override,从而程序无限循环。
another
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- int main(int argc,char * argv[]){
- int i=0;
- short a[4];
- for ( i = 0 ; i <= 4; i++) {
- a[i] = 0;
- printf("#");
- }
- printf("the function reach here \r\n");
- exit(0);
- }
把上面的程序略微已修改,程序的结果又大不一样,同样是变量的值被override,但是考虑到系统的little-enedian 与big-endian的不同,运行的结果也不一样。
little-endian 下系统也是死循环
big-endian模式下程序可以运行。
- #include <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include <assert.h>
- int foo(){
- int a[4];
- int i;
- printf("*******function call******");
- for ( i= 0; i <= 4;i++){
- a[i]-=4;
- printf("#");
- }
- printf("fun1 ");/* never reach here */
- return 1; /* never reach here */
- }
- int main( int argc,char * argv[]){
- foo();
- printf("main reach here \r\n");
- exit(0);
- }
这个程序自己测了一般,与预期的结果不服,虽然程序陷入了死循环但是不是预期那样,函数被无限调用,导致这种情况发生的原因是foo函数的栈格局与第一个程序的布局一样,从而导致程序虽然是死循环,但是原因不同
在VC下测了一把,程序运行正常
看来window &linux的栈的布局差异还是很大的,linux的栈的行为还是可以预测的,window知之甚少啊
该
程序是一个简单的函数调用,但是由于函数调用中用来保存函数返回地址的指针被数组赋值所override,导致函数被无限调用,从而陷入死循环---forever loop从上面的例子,不难看出C要求程序猿对内存的布局要十分的熟悉,假定你对你所要操作的东西都是十分确定了,编译器不会为你做过多的检查~~~~~~~~~~~~~`
附上VC的调试错误:
阅读(2513) | 评论(0) | 转发(0) |