在另一个结构中查找一个结构变量的偏移量时,将其作为一元“&”操作数需要的左值

时间:2019-01-16 22:54:57

标签: c pointers structure

我正在尝试访问以下结构的元素i,f和ch。

struct a{
    struct b{
        int i;
        float f;
        char ch;
    }x;

    struct c{
        int j;
        float g;
        char ch;
    }y;
};

必须通过将结构c的地址传递给函数并计算其到访问结构b的偏移量来完成

struct a z;
fun(&z.y);

功能如下:

fun(struct c *p){

    int offset;
    struct b *address;
    offset = (char *) &((struct c*)(&((struct a*)0)->y)->j) - (char *)((struct a*)0);
    address = (struct b*)((char *)&(p->j)-offset);
    address->i = 400;
    address->f = 3.14;
    address->ch = 'c';

}

尽管进行了很多尝试,但始终会显示错误lvalue required as unary '&' operand

我知道该错误的含义,但无法在此处完成。

谢谢。

1 个答案:

答案 0 :(得分:2)

&仅可用于变量(包括数组元素或struct成员)-更正式地称为 lvalues 。本质上,您可以在=左侧的任何内容上使用它(这就是左值获得其名称的方式)。例如,您无法执行&(1 + 1)。出于同样的原因,您也无法执行&(&some_variable)&some_variable不是左值。

很容易看到它们不是左值,因为您无法执行1 + 1 = something;&some_variable = something;

您有&((struct c*)(&((struct a*)0)->y)->j)。或者简化为&(&(something))。这是无效的。我不知道该函数要执行的操作,但是也许您使用了两个&而不是一个简单的错误。