Вопрос: почему мы декларируемp2
в качествеvoid **
? Почему нетp2*
?
мы возвращаем p2, но тип нашей возвращаемой функцииvoid *
. В этом нет никакого смысла. Компилятор скажет тип возвращаемого значения unmatch.
void *aligned_malloc(size_t required_bytes, size_t alignment) {
void *p1;
void **p2;
int offset=alignment-1+sizeof(void*);
p1 = malloc(required_bytes + offset); // the line you are missing
p2=(void**)(((size_t)(p1)+offset)&~(alignment-1)); //line 5
p2[-1]=p1; //line 6
return p2;
}
void**
можно неявно преобразовать вvoid*
, поэтому проблем с типом быть не должно.
Причина, по которой это заявленоvoid**
состоит в том, чтобы упростить хранение выделенного указателя прямо перед ним.
Он работает как этот код, в котором используется другая переменная:
void *aligned_malloc(size_t required_bytes, size_t alignment) {
void *p1;
void *p2;
void **p3;
int offset=alignment-1+sizeof(void*);
p1 = malloc(required_bytes + offset);
p2= (void*)(((size_t)(p1)+offset)&~(alignment-1));
p3 = (void**) p2;
p3[-1]=p1;
return p2;
}
void **
делает его массивом. И причина, по которой он стал массивом, в том, что нам нужно хранить выделенный указатель?