Проблемы с выравниванием при присвоении результата sbrk указателю - K&R

ссылаясь на этот код от Кернигана и Ритчи (2-е издание, стр. 188),

static Header* morecore(unsigned nu) {
    char *cp, *sbrk(int);
    Header* up;

    if (nu < NALLOC) 
        nu = NALLOC;

    cp = sbrk(nu * sizeof(Header));

    if (cp == (char*) -1) /* No space at all */
        return NULL;

    up = (Header*) cp;
    up->s.size = nu;
    free((void*)(up+1));
    return freep;
}

Вопрос здесь в том, что происходит, когда значение, возвращаемое sbrk, похоже на 101, выравнивание будет недействительным, когда присваивание указателя up выполняется в строке up = (Header*)cp;

У этого может быть действительно очевидный ответ, так что извините, если я его пропустил!


person Curious    schedule 09.02.2017    source источник
comment
Что происходит, не определено. На практике это может означать, что программа работает так, как ожидалось, работает так, как ожидалось, но медленнее, или аварийно завершает работу из-за ошибки выравнивания.   -  person Ross Ridge    schedule 09.02.2017


Ответы (1)


Согласно этой страницы, об авторитетности которой я не могу сказать:

Не указано, правильно ли выровнен указатель, возвращаемый функцией sbrk(), для какой-либо цели.

Так что, в принципе, да, вы вполне можете обнаружить проблемы с выравниванием.

person Ken Y-N    schedule 09.02.2017
comment
Я бы не согласился с вами здесь! - person Ken Y-N; 09.02.2017
comment
@Curious На самом деле это не ошибка, потому что она не должна соответствовать спецификации Singual Unix. Это пример кода, который можно использовать в реализации библиотеки C, и поэтому он также не соответствует стандарту C, поскольку определяет функции с именами malloc и free. - person Ross Ridge; 09.02.2017
comment
@RossRidge, если код не соответствует какой-либо спецификации, то, вероятно, следует утверждать, что значение, возвращаемое функцией, выровнено по правой границе? - person Curious; 09.02.2017
comment
@Curious В книге действительно упоминается следующее: использование typedef и union обрабатывает выравнивание (учитывая, что sbrk предоставляет соответствующий указатель). В книге признается, что выделение памяти по своей сути зависит от машины, и код только пытается ограничить эти зависимости, а не устранить их полностью. - person Ross Ridge; 09.02.2017
comment
@RossRidge хммм, так что на самом деле, если вы создаете библиотеку для malloc, вы всегда должны выравнивать такой указатель по правой границе, верно? - person Curious; 09.02.2017
comment
@Curious На самом деле вам это может не понадобиться, потому что на самом деле используемая реализация sbrk всегда возвращает правильно выровненную память. Учитывая то, как определяется и обычно реализуется sbrk, на самом деле это может быть верно для большинства или даже всех реализаций sbrk. Это почти наверняка было правдой в то время, когда была написана книга. - person Ross Ridge; 09.02.2017