==用于指针比较

Man*_*lio 28 c comparison pointers equality

我引用了Kernighan和Ritchie的"C编程语言":

任何指针都可以有意义地与零相等或不等式进行比较.但是对于算术或与不指向同一数组成员的指针进行比较的行为是未定义的.(有一个例外:超过数组末尾的第一个元素的地址可用于指针算法.)

这是否意味着我不能依赖于==检查不同指针的相等性?这种比较会导致错误结果的情况是什么?

das*_*ght 32

我想到的一个例子是哈佛架构,它为代码和数据提供了单独的地址空间.在该体系结构的计算机中,编译器可以将常量数据存储在代码存储器中.由于两个地址空间是分开的,因此指向代码存储器中的地址的指针可以在数字上等于数据存储器中的指针,而不指向相同的地址.

  • 这个答案与C无关,因为对象和函数指针不能直接比较,因为它们之间的转换没有定义.没有有意义的方法将函数指针与没有特定于实现的黑客攻击的对象指针进行比较.正如chazomaticus指出的那样,哈佛架构的编译器不可能在代码段中存储数据. (2认同)
  • 这不是"参差不齐".这是使用`const`完全不同于它的目的,打破任何**程序,使用`const`非常规.即使是标准库也行不通(`strlen`需要一个`const char*`并且无法测量非`constst`字符串的长度......). (2认同)

R..*_*R.. 8

为所有有效指针定义了相等运算符,并且它唯一可以给出"误报"的是当一个指针指向一个元素超过数组末尾时,另一个指针恰好指向(或者指向一个点)结构定义)到存储在内存中的数组之后的另一个对象.

我认为你的错误就是将K&R视为规范性的.请参阅C99标准(此处有很好的html版本:http://port70.net/~nsz/c/c99/n1256.html),6.5.9在等于运算符上.关于未定义比较的问题仅适用于关系运算符(见6.5.8):

比较两个指针时,结果取决于指向的对象的地址空间中的相对位置.如果指向对象或不完整类型的两个指针都指向同一个对象,或者两个指针都指向同一个数组对象的最后一个元素,则它们相等.如果指向的对象是同一聚合对象的成员,则指向稍后声明的结构成员的指针比指向结构中先前声明的成员的指针大,指向具有较大下标值的数组元素的指针比指向同一数组的元素的指针大.具有较低的下标值.指向同一个union对象的成员的所有指针都比较相等.如果表达式P指向数组对象的元素,并且表达式Q指向同一数组对象的最后一个元素,则指针表达式Q + 1比较大于P.在所有其他情况下,行为是未定义的.

  • -1你声明*"为所有有效指针定义了相等运算符,"*然后引用标准的相反*的部分(注意,如果它们都指向同一个对象,则表示等式计算结果为true;它确实**不是**如果他们指向不同的对象,则等于是假的)*. (8认同)
  • +1:首先回答参考规范.丹尼,我觉得你很困惑:引用的段落是关系比较,而不是平等比较.关于等式运算符的部分说:"当且仅当两个指针都指向同一个对象时,两个指针才相等...".这应该是公认的答案. (2认同)

Ton*_*ion 1

不能使用指针比较来比较指向不同数组的指针。

所以:

int arr[5] = {1, 2, 3, 4, 5};

int * p = &arr[0];

int anotherarr[] = {1, 2};

int * pf = &anotherarr[0];

你不能这样做,if (p == pf)因为p并且pf不指向同一个数组。这将导致未定义的行为。

如果它们指向同一数组,则可以依赖指针比较。

我自己不确定算术案例。