#include <stdarg.h>

/* Some definitions and declaration to make the code work */
#define IO 	    	01
#define USART		02
#define LCD		03
#define set_portB   	1

struct __port__ { int set; };
struct __io__ {
    struct __port__ portB;
    struct __port__ portC;
    struct __port__ portD;
};
typedef struct __io__ io;
typedef struct __io__ lcd;
typedef struct __io__ usart;

void init_peripheral(int ID, ...) {
    va_list device;
    va_start(device, ID);
    io* temp;
    (*temp).portB.set = set_portB;  // NOTE: dereferencing uninitialized pointer!!!
    
    if (ID == IO) {
        io* config_io;
        config_io = va_arg(device, *io);
        // ...
    } else if (ID == LCD) {
        lcd *config_lcd;
        config_lcd = va_arg(device, *lcd);
        // ...
    } else if (ID == USART) {
        usart *config_usart;
        config_usart = va_arg(device, *usart);
        // ... 
    }
    va_end(device);
}

int main() { return 0; }