是&p有效C,假设p是指向不完整类型的指针?

caf*_*caf 25 c pointers language-lawyer incomplete-type

以下示例是C中有效的完整翻译单元吗?

struct foo;

struct foo *bar(struct foo *j)
{
    return &*j;
}
Run Code Online (Sandbox Code Playgroud)

struct foo是一个不完整的类型,但我找不到明确禁止在C标准中解除引用不完整类型.特别是,§6.5.3.2说:

一元运算&符产生其操作数的地址.如果操作数具有类型''type'',则结果具有类型''指向类型''的指针.如果操作数是一元运算*符的结果,则不会对该运算符和&运算符进行求值,结果就好像两者都被省略,除了对运算符的约束仍然适用且结果不是左值.

结果不是左值的事实不是密切相关的 - 返回值不一定是.对*运营商的限制很简单:

一元*运算符的操作数应具有指针类型.

而对于&运营商来说:

一元运算&符的操作数应该是函数指示符,[]一元或一元运算*符的结果,或者是一个左值,它指定一个不是位字段且不用register存储类说明符声明的对象.

这两个都非常满意,所以结果应该等同于return j;.

但是,gcc 4.4.5不编译此代码.它反而出现以下错误:

y.c:5: error: dereferencing pointer to incomplete type
Run Code Online (Sandbox Code Playgroud)

这是gcc的缺陷吗?

Jen*_*edt 6

是的,我认为这是一个错误.因此*j,根据上下文,似乎也允许使用不完整类型的左值:

6.3.2.1 ...左值是具有对象类型或除void之外的不完整类型的表达式

基本上这应该工作,只要你不做任何事情与这样的左值,需要知道的结构struct.因此,如果您不访问该对象或询问其大小,这是合法的.