2016-11-19 4 views
0

Вопрос: Почему мы объявляем p2 как void **? почему не p2*?Реализация aligned_malloc с использованием malloc в C

Мы возвращаем p2, но наш тип функции возврата - void *. Это не имеет никакого смысла. Компилятор скажет unmatch return type.

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; 
} 
+5

http://stackoverflow.com/questions/12504776/aligned-malloc-in-c –

+0

Я думаю, Мария получила функцию от выше ссылка. Но она задает другой вопрос. –

ответ

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 **' должен сделать его массивом. И причина, по которой он становится массивом, заключается в том, что нам нужно сохранить выделенный указатель? – Maria

 Смежные вопросы

  • Нет связанных вопросов^_^