> is an assignment like fn4 = fn3 invalid?
Well it's fine as far as the syntax is concerned.
However, the pointer inside the structure presents big problems.
fn1.y = malloc( 10 * sizeof *fn1.y );
fn2 = fn1;
free( fn1.y );
// fn2.y is now a dangling pointer.
Structure assignments in C know nothing about the internals of the struct, it's just a handy wrapper around memmove( &fn2, &fn1, sizeof fn2 ); In C++, we would use a proper copy constructor to replicate what the pointer pointed to rather than just making a copy of the pointer.