繁体   English   中英

C语言中Sizeof运算符的复杂声明

[英]Complex Declaration of Sizeof operator in C

我已经在书中的某处看到了这个sizeof运算符的复杂声明,这很令我高兴:

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

谁能解释这个声明,这是怎么回事...?

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

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

现在,您知道它是如何工作的吗?

由于指针算术的属性,0将随着sizeof int增加而增加,最后的int类型转换将为您提供结果地址的值,即'size'。

但是,这完全是未定义的行为(对null的算法以及可能对无效指针的取消引用),毫无意义。


使用macro参数进行更新没有多大意义。 最终的std::uintptr_t可能应该是std::uintptr_t

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

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

现在以这种方式查看它,可能更容易看到宏首先将地址0转换为type的指针,然后再获取第二个元素的地址。 这将显示大小。

它将SIZEOF定义为整数的大小。

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

显然,这是一个令人讨厌的技巧,应该只使用sizeof int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM