Кстати, оно даже так работает
Код
void baa( struct foo *p);
void kwa() {
baa( &(struct foo){ 5, 6} );
}
Создаёт на стеке временную переменную типа struct foo, заполняет её и адрес передаёт. Вот avr-gcc. Ничем не отличается от явного указания локальной переменной с её инициализацией.
Код
.global kwa
.type kwa, @function
kwa:
push r29
push r28
rcall .
rcall .
in r28,__SP_L__
in r29,__SP_H__
/* prologue: function */
/* frame size = 4 */
ldi r24,lo8(5)
ldi r25,hi8(5)
std Y+2,r25
std Y+1,r24
ldi r24,lo8(6)
ldi r25,hi8(6)
std Y+4,r25
std Y+3,r24
movw r24,r28
adiw r24,1
rcall baa
/* epilogue start */
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop __tmp_reg__
pop r28
pop r29
ret
Именно так и пользовался — для инициализиации записей в EEPROM значениями по умолчанию при слёте CRC (ну, тех записей, которые можно было просто переинициализировать).
Цитата(MrYuran @ Nov 25 2010, 16:21)

Присваивать-то можно, но не факт что оптимально будет присваиваться.
Всё-таки memcpy() предпочтительнее
Так выше ж было сказано, что он memcpy для этого и вызывает.
Когда-то раньше, кто-то другой, кто
не умел по месту разбираться в длине/её константности в вызове memcpy и вызывал именно функцию memcpy всегда, для копирования структур присваиванием прикидывал и либо делал почленное копирования по месту, либо вызывал memcpy. Так что присваивание структур компилировалось оптимально.