lvalue требуется в качестве унарного операнда '&' при поиске смещения структурной переменной внутри другой структуры - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь получить доступ к элементам 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 голосов
/ 17 января 2019

& может использоваться только с переменными (включая элементы массива или элементы структуры) - более формально называется lvalues ​​. По сути, вы можете использовать его на всем, что может быть слева от = (именно так lvalues ​​и получили свое имя). Вы не можете сделать, например, &(1 + 1). Вы также не можете сделать &(&some_variable) по той же причине: &some_variable не является lvalue.

Легко видеть, что это не lvalues, поскольку вы не могли сделать 1 + 1 = something; или &some_variable = something;.

У вас есть &((struct c*)(&((struct a*)0)->y)->j). Или упрощенно, &(&(something)). Это недействительно Я не знаю, что пытается сделать функция, но, возможно, вы использовали две & вместо одной по простой ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...