c - *(void **) &(int[2]){0,PAGE_SIZE}; 的意思是什么?

7

背景

阅读某些内核代码。

问题

我无法理解这一行的含义。

*(void **) &(int[2]){0,PAGE_SIZE};

更多,这是什么意思?
{0,PAGE_SIZE}

在我看来,带有逗号的这个并不像是一个函数。

这段代码到底是什么意思?我不理解这里的间接引用。

它是一个函数还是转换?方括号部分代表什么意思?对我来说似乎很复杂,但肯定有意义。


3
复合字面量 - user3920237
3
这就是人们试图做花哨的结果。可能应该只写成int[] const foo = {0, PAGE_SIZE}; *(void**)(&foo); - Billy ONeal
@BillyONeal:在宏内部,这是有意义的(然而GCC特殊块语法会对内核代码有所帮助)。 - Alexandre C.
1个回答

7
(int[2]) { 0, PAGE_SIZE }

这是一个表达式(称为组合文字),其值是包含两个int的数组。该数组的地址被获取,转换为void **,并进行解引用。

最终结果是将数组内容重新解释为指向void的指针。

请注意,您可以获取复合文字的地址,因为它们是左值。例如,请参见此问题


你如何获取表达式的地址?我认为只能对lvalue执行此操作。 - templatetypedef
因为当你谈论数组时,默认情况下只引用地址!你的疑问可能对于像int类型变量等基元类型是有效的。@templatetypedef... - Am_I_Helpful
@templatetypedef-第一条语句完全正确!而且,数组是由强制类型转换产生的,因此它是一个简单的数组,因为使用了{...}!如果你试图将{...}赋值给一个非指针或非数组变量,你将会收到错误提示! - Am_I_Helpful
1
@templatetypedef 我猜复合字面量语法是将其强制转换为指向第一个元素的指针。 - user3920237
即使是这种情况,你也不能将&运算符应用于非左值(或者可以吗?)@remyabel - templatetypedef
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接