从普通指针中减去空指针?

时间:2013-05-22 17:23:44

标签: c++ pointers null

我遇到了这个功能:

    int foo(int *p)
    {
      return p - (int*)0;
    }

有人可以解释这是做什么的吗?它似乎返回一个整数。这个减法背后的逻辑是什么?还有评论说这是一个纯粹的,可重入的功能。

3 个答案:

答案 0 :(得分:8)

它具有未定义的行为,因为指针算法仅在数组中定义。

实际上,在通过数字地址表示指针并且具有足够大的整数和由地址0表示的空指针的机器上,它将字节地址转换为字地址。也就是说,它在空指针的地址和地址int之间给出了p大小的内存块。

  

还有评论说这是一个纯粹的,可重入的功能。

“Pure”表示它没有副作用,结果仅取决于其输入。 “重入”意味着在它正在进行时调用是安全的(例如,来自中断处理程序) - 它没有内部静态数据。

答案 1 :(得分:0)

减去两个指针返回一个类型为ptrdiff_t的整数,即两个指针之间的偏移量,单位为sizeof(int)。是否可以有效地转换为int是依赖于实现的。减去空指针会导致未定义的行为。

这似乎是一种将指针转换为整数的复杂且不可靠的方法。更好的方法是将其转换为intptr_t并除以sizeof(int)

答案 2 :(得分:0)

我猜想写这个功能的人认为他们比他们更聪明。它没有做任何简单的演员不会做得更好。

关于“纯粹”和“折返”......

纯函数是唯一影响返回值的函数。它不会导致状态变化。

可重入函数是线程安全的。它可以被另一个线程中断和调用,而不会改变原始调用的效果。

所有纯函数都是可重入的。

它是一个纯函数的事实是显而易见的,它的重入也是如此。评论和函数本身一样毫无意义。