指针在提供方便的同时,也相当危险.
int main(int argc, const char * argv[]) {
int array[4] = {9,10,11,12};
int array2[8] = {1,2,3,4,5,6,7,8};
for (int i = 0; i < 12; ++i) {
printf("%d\n", array2[i]);
}
return 0;
}
运行的结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
array、array2的内存结构,在它们初始化的时,都是放在栈中,而栈的物理结构是连续的,并且按照FIFO的原则,array先初始化放在高地址,array2后初始化放在低地址。如下图所示:
array和array2在栈上的存储结构.png可见,透明的指针带来的问题在于,开发者知道了太多他们本来不该知道的东西(比如开发者竟然可以拿到变量的真实地址,还可以不借助变量名就访问一个变量,比如这里的 array)。在某些精心构造的场合下,攻击者甚至可以通过修改字符串的值来控制程序的执行逻辑,只要计算得当,他们可以调用原本根本不会被调用的函数。
在引用的概念中,引用就是引用,它什么也不是,更不可能是数字,也就谈不上什么四则运算了。因此想要通过 A 对象的引用来访问 B 对象是完全不可能的。
网友评论