指针的危险

指针的危险

下面的代码有没有问题?如果有的话,问题在哪里?

int array[ARRAY_SIZE];

int *pi;

for( pi = &array[0]; pi < &array[ARRAY_SIZE]; )

{

*++pi = 0;

}

有两个错误。对增值后的指针进行解引用时,数组的第一个元素并没有被清零。另外,指针在越过数组的右边界以后仍然进行解引用,它将把其他某个内存地址的内容清零。

注意pi在数组之后立即声明。如果编译器恰好把它放在紧跟数组后面的内存位置,结果将是灾难性的。当指针移到数组后面的那个内存位置时,那个最后被清零的内存位置就是保存指针的位置。这个指针(现在变成了零)因此仍然小于&array[ARRAY_SIZE],所以循环将继续执行。指针在它被解引用之前增值,所以下一个被破坏的值就是存储于内存位置4的变量(假定整型的长度为4个字节)。如果硬件没有捕捉到这个错误并终止程序,这个循环将快乐地继续下去,指针在内存中欢快地前行,破坏它遇见的所有值。当它再一次到达这个数组的位置时,就会重复上面这个过程,从而导致一个微妙的无限循环。

出处:《C和指针》。Kenneth A. Reek 著,徐波译。人民邮电出版社。第113页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值