我最近一直在考虑一些遗留代码并遇到了这个
struct A
{
struct B
{
...
};
B member[0]; // Well known struct hack. Don't require any help here
static int32_t Size(uint32_t count) return { (int32_t)(sizeof( A ) + count * sizeof( B[1]));}
};
我需要一些帮助来理解Size()方法。
为什么不使用size( A ) + count * size( B )
??
B[1]
有什么用?
我不明白为什么这个问题被投了票。 链接到正在运行的代码。
答案 0 :(得分:1)
无论B
被定义为什么,它肯定是一个指针。
sizeof(B)
将返回指针的大小,而sizeof(B[1])
将返回定义为B
的元素类型的大小。
以下片段将打印4,1
:
#include <stdio.h>
int main(int arg, char *argv[])
{
char *B;
printf("%d,%d\n",sizeof(B),sizeof(B[1]));
}
请注意,引用B[1]
并不是未定义的行为,因为sizeof()
在预处理时有效。
答案 1 :(得分:0)
纠正了代码中明显的拼写错误......
sizeof
的操作数可以是表达式,也可以是类型
(必须在括号中)。在您的情况下,B
是一种类型,所以
B[1]
也是一种类型:1 B
的数组。
至于为什么作者写了一些如此愚蠢的东西,而不仅仅是
写sizeof(B)
,你必须问他。我从来没见过
任何人都这样做。 (如果他有的话可能会有意义
写member[0]
。但不是B[1]
。)