3:struct.c 这个程序是为了测试如果数据发生了覆盖和数组溢出,会发生什么情况。 代码为:
#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 段错误 (核心已转储) */可以看出a只有两个区域,所以在i为0和1的时候都没有发生什么错误,但当i超过了1的时候,因为s.d先被赋值,而在结构体里面s.d是在s.a的后面,且局部变量在栈里面的存储方式是自下到上, 所以会发生覆盖的情况,所以之后的值输出会发生错误,甚至出现段错误。
