Primeiro, veja este exemplo:
O código C para um programa C simples é fornecido abaixo
struct Foo {
char a;
int b;
double c;
} foo1,foo2;
void foo_assign(void)
{
foo1 = foo2;
}
int main(/*char *argv[],int argc*/)
{
foo_assign();
return 0;
}
O código ASM equivalente para foo_assign () é
00401050 <_foo_assign>:
401050: 55 push %ebp
401051: 89 e5 mov %esp,%ebp
401053: a1 20 20 40 00 mov 0x402020,%eax
401058: a3 30 20 40 00 mov %eax,0x402030
40105d: a1 24 20 40 00 mov 0x402024,%eax
401062: a3 34 20 40 00 mov %eax,0x402034
401067: a1 28 20 40 00 mov 0x402028,%eax
40106c: a3 38 20 40 00 mov %eax,0x402038
401071: a1 2c 20 40 00 mov 0x40202c,%eax
401076: a3 3c 20 40 00 mov %eax,0x40203c
40107b: 5d pop %ebp
40107c: c3 ret
Como você pode ver que uma atribuição é simplesmente substituída por uma instrução "mov" na montagem, o operador de atribuição significa simplesmente mover dados de um local de memória para outro local de memória. A atribuição fará isso apenas para membros imediatos de uma estrutura e falhará ao copiar quando você tiver tipos de dados complexos em uma estrutura. Aqui, COMPLEXO significa que você não pode ter uma matriz de ponteiros, apontando para listas.
Uma matriz de caracteres dentro de uma estrutura não funcionará na maioria dos compiladores, porque a atribuição simplesmente tentará copiar sem sequer olhar para o tipo de dados de tipo complexo.