Ok, I've got structs and arrays of structs together here, and using memcpy to fill one of the secondary structs erases the whole goddamn struct, not just the secondary one. Example code is below. When memcpy is called on the Defaults.System struct, it erases all of Defaults while setting Defaults.System.

I thought I'd work around it by writing a copy function of my own, but I can't figure out how to declare a function to send pointers to the system_vars structs I want copied.

Code:
struct system_vars {
    int SysId;
    int OpSize;
    int fType;
    int Language;
    int HeaderLen;
    u32 vOffset;
    u32 AddrMask;
    int Endian;
} SysVars[7];

struct ini {
    LOGFONT lvFontInfo;
    int MainWidth;
    int MainHeight;
    int MainStatus;
    WINDOWPLACEMENT MainPlacement;
    struct system_vars System;
    struct system_vars UserSys[1];
    int RegView;
    int RegAlign;
} Settings, Defaults;
Code:
    memset(&Defaults,0,sizeof(Defaults));
    memset(&Settings,0,sizeof(Settings));
    memset(&SysVars,0,sizeof(SysVars));
    Defaults.lvFontInfo = (LOGFONT){ 0, 0, 0, 0, 0, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_MODERN, "Terminal"} ;
    Defaults.MainPlacement.length = sizeof(WINDOWPLACEMENT);
    Defaults.RegView = MNU_REGVIEW0;
    Defaults.RegAlign = MFS_CHECKED;
    SysVars[PS2_ELF].SysId = PS2_ELF;
    SysVars[PS2_ELF].OpSize = 4;
    SysVars[PS2_ELF].Language = R5900;
    SysVars[PS2_ELF].fType = ELF_FILE;
    SysVars[PS2_ELF].Endian = LITTLE_ENDIAN32;
    
    SysVars[PS2_RAW].SysId = PS2_RAW;
    SysVars[PS2_RAW].OpSize = 4;
    SysVars[PS2_RAW].Language = R5900;
    SysVars[PS2_RAW].fType = RAW_FILE;
    SysVars[PS2_RAW].Endian = LITTLE_ENDIAN32;

    SysVars[N64_ROM].SysId = N64_ROM;
    SysVars[N64_ROM].OpSize = 4;
    SysVars[N64_ROM].Language = R4300i;
    SysVars[N64_ROM].HeaderLen = 0x40;
    SysVars[N64_ROM].vOffset = 0x00000040;
    SysVars[N64_ROM].fType = N64ROM_FILE;

    SysVars[N64_RAW_LE].SysId = N64_RAW_LE;
    SysVars[N64_RAW_LE].OpSize = 4;
    SysVars[N64_RAW_LE].Language = R4300i;
    SysVars[N64_RAW_LE].AddrMask = 0x80000000;
    SysVars[N64_RAW_LE].fType = RAW_FILE;
    SysVars[N64_RAW_LE].Endian = LITTLE_ENDIAN32;

    SysVars[N64_RAW_BE].SysId = N64_RAW_BE;
    SysVars[N64_RAW_BE].OpSize = 4;
    SysVars[N64_RAW_BE].Language = R4300i;
    SysVars[N64_RAW_BE].AddrMask = 0x80000000;
    SysVars[N64_RAW_BE].fType = RAW_FILE;
    SysVars[N64_RAW_BE].Endian = BIG_ENDIAN;

    SysVars[PS1_RAW].SysId = PS1_RAW;
    SysVars[PS1_RAW].OpSize = 4;
    SysVars[PS1_RAW].Language = R3000;
    SysVars[PS1_RAW].AddrMask = 0x80000000;
    SysVars[PS1_RAW].fType = RAW_FILE;
    SysVars[PS1_RAW].Endian = LITTLE_ENDIAN32;

    memcpy(&Defaults.System,&SysVars[PS2_ELF],sizeof(SysVars[PS2_ELF]));
;