简述栈溢出

    xiaoxiao2024-11-13  77

    #include <stdio.h> #include <stdlib.h> typedef struct { int a[2]; double d; } struct_t;double fun(int i) { volatile struct_t s; s.d = 3.14; s.a[i] = 1073741824; /* Possibly out of bounds */ return s.d; /* Should be 3.14 */ }int main(int argc, char *argv[]) { int i = 0; if (argc >= 2) i = atoi(argv[1]); double d = fun(i); printf("fun(%d) --> %.10f\n", i, d); return 0; } /* gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 0 fun(0) --> 3.1400000000 gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 1 fun(1) --> 3.1400000000 gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 2 fun(2) --> 3.1399998665 gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 3 fun(3) --> 2.0000006104 gec@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 4 fun(4) --> 3.1400000000 段错误 (核心已转储)*/

    在上面的代码中,我们定义了一个数组,只能存储两个整型,接下来就是双精度,然后我们结果如上,当输入0,1时都没有问题,都能正常输出,当输入2,3,4时,就出现问题了,这就是栈溢出,没有啊a[2]这个位置给他,他就占用了双精度的位置,使得双精度的数据被覆盖了一些,所以输出的内容发生了改变。

    最新回复(0)