0

我在书中某处看到了这个复杂的 sizeof 运算符声明,这在取笑我:

#define SIZEOF(int)  (int)&((int *)0)[1]

任何人都可以解释这个声明,这里发生了什么......?

4

3 回答 3

6

这是[1]“扩展”部分:

(int)(&(*(((int*)0) + 1)))

现在你明白它是如何工作的了吗?

sizeof int由于指针算术的属性,0 将增加,最后的转换int为您提供结果地址的值,即“大小”。

这是完全未定义的行为(null 的算术,可能还有无效指针的取消引用),相当没有意义。


用宏参数更新没有多大意义。最后的演员应该是std::uintptr_t

于 2012-06-03T11:37:00.073 回答
4

首先 - 它与术语混淆int- 我们自然假设它是熟悉类型的关键字,但在这种情况下它不是 - 相反,它是宏的参数。所以为了简化,考虑如下宏:

#define SIZEOF(type)  &((type *)0)[1]

现在这样看,可能更容易看出宏首先将地址 0 转换为指向 的指针type,然后获取第二个元素的地址。这将显示大小。

于 2012-06-03T11:36:34.693 回答
1

它定义SIZEOF为整数的大小。

  • (int *)0是地址为零的 int 指针
  • [1]访问该整数之后的下一个整数。
  • 由于(int *)0地址为零,因此它之后的地址sizeof int正好位于前一个地址之后。
  • (int)将其转换为数字,因为大小是数字,而不是指针。

显然这是一个讨厌的黑客,应该简单地使用sizeof int.

于 2012-06-03T11:36:34.723 回答