越界访问和缓冲区溢出
- 代码部分
#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; //可能越界
return s.d; //结果应该是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;
}
注意:
argc表示传入main函数的参数个数,argv表示传入main函数的参数序列或指针,第一个参数argv[0]是程序的名称,且包含程序所在的完整路径,我们输入的参数个数应为argc-1个。
volatile关键词影响编译器编译的结果,用volatile表明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错。
- 实验结果
这张图很好的解释了上面的实验结果