, , , undefined (UB).
myfree(2, &one, &two); void * void **. &one, &two char **, sometype_t **.
myfree() , void **:
void ** del = va_arg(ap, void **);`
:
va_arg .... ... ..., undefined C11dr §7.16.1.1 2
, void ** char **, sometype_t **. , , . , UB.
OP, , :
: : , 'int **' type 'void **'
f(&intptr);. §7.16.1.1 2 . :
. , undefined. C11dr §6.3.2.3 7
, , . , UB , .
Alternative
void *. , free'd NULL.
void myfree(size_t n, ...) {
void *del;
va_list ap;
va_start(ap, n);
while (n > 0) {
del = va_arg(ap, void *);
free(del);
--n;
}
va_end(ap);
}
void* . . printf("%p\n", (void*) two);
char *one = malloc(x);
sometype_t *two = malloc(x);
void *three = malloc(x);
myfree(3, one, (void*) two, three);
2
, , .
Maybe, instead myfree(n, ...), what about encoding some more popular sizes, even as a macro, and leave that out? This, of course, meets most coding needs and, of course, avoids the error myfree(3, p1, p2). Recall that it is normal to callfree4(p1, p2,p3,0);
free2(void *p1, void *p2)`
free3(void *p1, void *p2, void *p3)
free4(void *p1, void *p2, void *p3, void *p4)