[英]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.