Обычно назначаются указатели с выделениями, используя неявное преобразование void * функции return, как и malloc():
void *malloc(size_t size);
int *pi = malloc(sizeof *pi);
Я хотел бы выполнить одно и то же присваивание при передаче адреса целевого указателя и без явного извлечения его типа изнутри функции (не внутри ее тела, ни аргументов).
Следующий код, похоже, достигает именно этого.
- Я хотел бы знать, полностью ли код полностью соответствует (любому) стандарты C.
- Если это не соответствует, я хотел бы знать, возможно ли достичь моего требования при соблюдении (любого из) стандартов C.
.
#include <stdio.h>
#include <stdlib.h>
int allocate_memory(void *p, size_t s) {
void *pv;
if ( ( pv = malloc(s) ) == NULL ) {
fprintf(stderr, "Error: malloc();");
return -1;
}
printf("pv: %p;\n", pv);
*((void **) p) = pv;
return 0;
}
int main(void) {
int *pi = NULL;
allocate_memory(&pi, sizeof *pi);
printf("pi: %p;\n", (void *) pi);
return 0;
}
Результат:
pv: 0x800103a8;
pi: 0x800103a8;