【问题标题】:sizeof operator macro #define MYSIZEOF(X) ((X*)0 +1) [duplicate]sizeof 运算符宏#define MYSIZEOF(X) ((X*)0 +1) [重复]
【发布时间】:2015-09-03 06:49:52
【问题描述】:
#include<stdio.h>
#define MYSIZEOF(X) ((X*)0 +1)
int main()
{
    printf("%ld", MYSIZEOF(int));
    return 0;
}

谁能解释一下它是如何工作的? 在此先感谢

【问题讨论】:

  • @ChrisBeck 无关(这是查找数组的大小,此代码正在查找指向隐式单元素数组(在 C++ 中有效)的 PTE“迭代器”的指针,但它尝试解释结果地址的整数值...?)
  • @sehe 是的,我意识到现在,实际上没有任何“sizeof”在那里......我认为该睡觉了:X
  • 为什么反对票?
  • @MichaelWalz 人们往往不喜欢c/c++ 双重标记,看到`(X*)0` 表明这是在与UB 调情。此外,没有想法的“这段代码做了什么”基本上是“亲爱的懒惰网络”,可能会触发一些人。老实说,这个问题并没有太多值得关注的地方(我没有投反对票)
  • 我不认为这是一个合适的副本。副本仅涵盖与此问题相关的一个小方面

标签: c++ c


【解决方案1】:

这里的想法很简单:对指向类型T 的指针的算术运算以sizeof(T) 的倍数执行,因此((X*)0 +1) 将(希望)成为指向内存地址sizeof(X) 字节的指针。

不幸的是,行为未定义为(X*)0 会创建一个 NULL 指针,并且编译器可能会替换一些非零值用作它正在编译的系统上的标记。此外,代码假定%ld 是正确的指针格式,但它可能不是。如果printf 实现支持%p,那将是一个改进。

当然,不直接使用sizeof操作符是很傻的......

【讨论】:

  • 然后,指针的整数值可能不适合直接解释。相反,它可以再次与 nullptr 进行比较。我不认为取 nullptr 的积分值本身就是 UB(但解释它是 IB)
  • @venki 是的。它只是在您的实施中添加数字。谷歌“指针算法”
  • @sehe: " 我不认为获取 nullptr 的积分值本身就是 UB" - 但添加它可能会使其跨越段边界或其他东西...我相信这是未定义的(您只能推断特定数组中的指针运算,直到最后一个地址)。
猜你喜欢
  • 2011-08-28
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 2015-03-04
  • 2019-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多