I used an example on writingshaders.com to create framebuffers like this:

Code:
/* Input parameter for each framebuffer is a struct: */

typedef struct {
    miInteger name;
    miTag type;
    miBoolean filtering;      
    miTag filename;
} named_framebuffer;


/* Parameter struct for shader function: */

struct make_named_framebuffers {
    int i_fb;
    int n_fb;
    named_framebuffer fb[1];
};

extern "C" DLLEXPORT
int make_named_framebuffers_version(void) { return 1; }

/* Struct to store evaluated parameters: */

typedef struct {
    char* name;
    char* type;
    miBoolean filtering;
    char* filename;
} fb_args;


/* Evaluate the parameters required to define framebuffers: */

std::vector<fb_args> get_named_framebuffer_args(
    miState *state, struct make_named_framebuffers *params)
{
    int n_fb = *mi_eval_integer(&params->n_fb);
    int i_fb = *mi_eval_integer(&params->i_fb);    

    mi_info("Making %i user framebuffers:", n_fb);

    std::vector<fb_args> args(n_fb);
    for (int i = 0; i < n_fb; ++i) {
	named_framebuffer p = params->fb[i + i_fb];
	args[i].name = miaux_tag_to_string(*mi_eval_tag(&p.name), NULL);
	args[i].type = miaux_tag_to_string(*mi_eval_tag(&p.type), NULL);
	args[i].filtering = *mi_eval_boolean(&p.filtering);
	args[i].filename = miaux_tag_to_string(*mi_eval_tag(&p.filename), NULL);
	mi_progress("   Buffer %s: filename '%s', type '%s', filtering %s",
		    args[i].name, args[i].filename, args[i].type,
		    args[i].filtering ? "on" : "off");
    }
    return args;
}
If I want to extend the interface like this:

Code:
struct make_named_framebuffers {
    miBoolean contrast;
    int i_fb;
    int n_fb;
    named_framebuffer fb[1];
};
I get fatal errors during rendering.
The problem is this line:

named_framebuffer p = params->fb[i + i_fb];

It only works if I use

named_framebuffer *p = &params->fb[i + i_fb];