Destination wird per Wert übergeben, du schreibst nur in eine lokale Kopie.

Code:
void Set_Image (volatile Daten * dest, unsigned char Source_Address)
{
   unsigned char i=0;
   
   for (i=0;i<Name_Length;i++)
   {
      dest->Name[i] = pgm_read_byte(&Sternbilder[Source_Address].Name[i]);
   }
   for (i=0;i<Daten_Length;i++)
   {
      dest->Bitfield[i] = pgm_read_byte(&Sternbilder[Source_Address].Bitfield[i]);
   } 
}