我遇到了这个功能:
int foo(int *p)
{
return p - (int*)0;
}
有人可以解释这是做什么的吗?它似乎返回一个整数。这个减法背后的逻辑是什么?还有评论说这是一个纯粹的,可重入的功能。
答案 0 :(得分:8)
它具有未定义的行为,因为指针算法仅在数组中定义。
实际上,在通过数字地址表示指针并且具有足够大的整数和由地址0表示的空指针的机器上,它将字节地址转换为字地址。也就是说,它在空指针的地址和地址int
之间给出了p
大小的内存块。
还有评论说这是一个纯粹的,可重入的功能。
“Pure”表示它没有副作用,结果仅取决于其输入。 “重入”意味着在它正在进行时调用是安全的(例如,来自中断处理程序) - 它没有内部静态数据。
答案 1 :(得分:0)
减去两个指针返回一个类型为ptrdiff_t
的整数,即两个指针之间的偏移量,单位为sizeof(int)
。是否可以有效地转换为int
是依赖于实现的。减去空指针会导致未定义的行为。
这似乎是一种将指针转换为整数的复杂且不可靠的方法。更好的方法是将其转换为intptr_t
并除以sizeof(int)
。
答案 2 :(得分:0)
我猜想写这个功能的人认为他们比他们更聪明。它没有做任何简单的演员不会做得更好。
关于“纯粹”和“折返”......
纯函数是唯一影响返回值的函数。它不会导致状态变化。
可重入函数是线程安全的。它可以被另一个线程中断和调用,而不会改变原始调用的效果。
所有纯函数都是可重入的。
它是一个纯函数的事实是显而易见的,它的重入也是如此。评论和函数本身一样毫无意义。