Attenzione all'uso della calloc: il prototipo della funzione è
codice:
void * calloc ( size_t num, size_t size );
quindi innanzitutto il primo argomento deve essere il numero di elementi da allocare, e il secondo la dimensione di ciascuno di essi, mentre tu hai fatto il contrario... e poi devi (o almeno è consigliabile) "castare" il puntatore restituito dalla funzione (che è un puntatore a void) nel tipo che ti interessa, quindi nel tuo caso la scrittura corretta sarà:
codice:
objs_tmp= (struct object *) calloc(2, sizeof(struct object));
Considerazioni analoghe anche per la seconda allocazione.
Per quanto riguarda la memcpy(), il suo prototipo è
codice:
void * memcpy ( void * destination, const void * source, size_t num );
quindi con la chiamata che fai tu sposti un certo numero di byte (pari al doppio della dimensione di una struttura di tipo "struct object") dalla posizione di origine "objs_tmp" a quella di destinazione "objs". Ovviamente, però, per il puntatore di destinazione devi allocare dello spazio in maniera tale da poter copiare i byte senza problemi...