Home > Mobile >  error: lvalue required as left operand of assignment for &d1->b = d2; but no error for d1 = (void
error: lvalue required as left operand of assignment for &d1->b = d2; but no error for d1 = (void

Time:10-19

#include <stdio.h>
#include <stdint.h>

struct s1
{
    uint8_t a;
    uint16_t b;
    uint8_t c;
};

struct s2
{
  uint8_t d;
  uint8_t e;
};

int main()
{
    struct s1 *d1;
    struct s2 *d2;
    
    d1->a = 1;
    d1->b = 2;
    d1->c = 3;
    
    d2->d =4;
    d2->e =5;
    
    &d1->b = d2;

    return 0;
}

Why doesn't &d1->b = d2; work? b is 32 bit and the struct s2 is also 32 bit? As we are just assigning the address.

If that line is changed to d1 = (void *)d2; It works without an error.

CodePudding user response:

First. The pointer d1 and d2 are not initialized. Using this pointer invokes Undefined Behavior. To fix it I suggest making the the actual object with automatic storage.

struct s1 d1;
struct s2 d2;

You cannot assign d2 to d1.b because the types do not match. struct s2 and uint16_t are not compatible. To do this type of type punning use memcpy().

memcpy(&d1.b, &d2, sizeof d2);
  • Related