Реализуйте align_malloc с помощью malloc в C [дубликат]

Вопрос: почему мы декларируем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;
}
# malloc alignment memory
Источник
  • 5
    stackoverflow.com/questions/12504776/aligned-malloc-in-c
  • 0
    Думаю, Мария получила функцию по указанной выше ссылке. Но она задает другой вопрос.
Codelisting
за 0 против
Лучший ответ

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;
}
  • 0
    так что в основном void ** делает его массивом. И причина, по которой он стал массивом, в том, что нам нужно хранить выделенный указатель?
Codelisting
Популярные категории
На заметку программисту