指针进行比较运算时极易犯的错误!

本文通过两个小程序对比,分析了指针操作时容易出现的越界问题,并详细解释了为何某些指针比较操作会导致未定义行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先给出两个小程序;

a.正确运行的程序:

#include <stdio.h>
void main()
{
	int a[10] = {1,2,3,4,5,6,7,8,9,10};
	int *p;

	for (int *p = a;p < &a[10];)
		*p++ = 0;
//************或者下面for语句****************//
	//for (int *p = &a[10];p > a;)
		//*--p = 0;
}


b.错误运行的程序:

#include <stdio.h>
void main()
{
	int a[10] = {1,2,3,4,5,6,7,8,9,10};
	int *p;
	
	for (int *p = &a[9];p >= a;)
		*--p = 0;
}
其错误提示如下:


分析:

b中程序在数组第1个元素a[0]被清除之后,指针p的值还继续减下去,而接下去的一次比较运算是用于结束循环的。

但就是问题所在:比较表达式p >= a(即:p >= &a[0] )的值是未定义的!因为指针p已到了数组的边界之外。标准允许

指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针进行比较,但不允许与数组第1个元素之前的

那个内存位置的指针进行比较


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值