// 程序员宝典 71页 面试题9 自覆盖的错觉,地址也是一个数,(右端未做类型检查被赋值)
/*
#include<iostream>
using namespace std;
struct S {
int i;
int *p;
};
int main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;// 对指针赋值常数,成功,很危险,不做类型检查!
cout<<s.i<<endl;
cout<<s.p<<endl;
s.p=p;
s.p[1]=1; // s.p[1]==p[1]==s.p =1 很巧妙的自我覆盖
s.p[0]=2;// s.p[0]=1[0],访问了非法的固定地址,程序崩溃。
return 0;
}
*/
/*
#include<iostream>
using namespace std;
struct S {
int i;
int *p;
};
int main()
{
S s;
int *p=&s.i;
p[0]=4;
p[1]=3;// 对指针赋值常数,成功,很危险,不做类型检查!
cout<<s.i<<endl;
cout<<s.p<<endl;
s.p=p;
s.p[1]=1; // s.p[1]==p[1]==s.p =1 很巧妙的自我覆盖
s.p[0]=2;// s.p[0]=1[0],访问了非法的固定地址,程序崩溃。
return 0;
}
*/
本文通过一个C++示例程序,展示了如何利用指针进行数据覆盖,并深入探讨了这种做法的风险及其背后的原因。文章重点讲解了指针操作不当可能导致的内存访问错误和程序崩溃等问题。

被折叠的 条评论
为什么被折叠?



