例外処理っぽくというと

int *p = malloc(...);
int *q = malloc(...);
...;
if(err) goto FREE;
...;
if(err) goto FREE;
...;
FREE:
free(p);
free(q);

こんな感じ?でもこれって

int *p = malloc(...);
int *q = malloc(...);
sub(p, q);
free(p);
free(q);

void sub(p, q) {
...;
if(err) return;
...;
if(err) return;
...;
}

こうしたほうが綺麗だよね
やっぱ使い道見えてこんわ