установить apt-get на Linux-сервере Red Hat

calloc (4, 6) и calloc (6, 4) НЕ то же:

В типичной 32bit/64bit системе, первое выделило бы 32 байта и вторые 24 байта.

void *calloc(size_t nelem, size_t elsize);

ключевой пункт - то, что calloc должен возвратить память, как будто это было правильно выровненное как массив. Это предназначено, чтобы выделить массив и использоваться следующим образом:

A *p = (A*)calloc(count, sizeof(A));
for (int i = 0; i < count; ++i)
{
    f(&(p[i]));
    // f(p + i) is also valid
}

или

A *p = (A*)calloc(count, sizeof(A));
for (A *q = p; q != p + count; ++q)
{
    f(q);
}

calloc, как предполагается, выделяет дополнение принятия во внимание массива и другие эксплуатационные требования целевой системы. Таким образом на большей части машин на 32 бита, где 6 байтовых структур должны были бы быть дополнены к 8 байтам, они выделят 4 партии 8 байтов.

calloc, где первым аргументом является sizeof () наиболее вероятен ошибка и должен быть исследован.

calloc, где вторым аргументом не является sizeof (atype), не определен. Это сильно пахнет скрытыми предположениями и опасно для порта.

Разъяснение: В типичной 32bit/64bit системе, структура, вероятно, будет дополнена и выровнена к нескольким 32 битам. Как таковой в этих системах sizeof не был бы возврат 6 байтов. На самом деле нет никакой гарантии, что компилятор не заполнил бы и выровнял бы некоторым несколько 16 байтов если, именно это требует компилятор/платформа.

Мой ответ основан на факте, Вы не должны делать предположения о размере структуры. Они могут измениться с параметрами компилятора или целевой платформой. Просто удостоверьтесь, что Вашим вторым аргументом является sizeof выражение, и не делают посылки .

От стандарт :

calloc () функция должна выделить неиспользуемое место для массива nelem элементов, каждый чей размер в байтах является elsize. Пространство должно быть инициализировано ко всем битам 0.

указатель, возвращенный, если выделение успешно выполняется, должен быть соответственно выровненный так, чтобы это могло присваиваться указателю на любой тип объекта и затем использоваться для доступа к такому объекту или массиву таких объектов в выделенном месте (пока пространство явно не освобождено или перераспределено). Каждое такое выделение должно привести к указателю на объект, непересекающийся от любого другого объекта. Возвращенный указатель должен указать на запуск (самый низкий адрес байта) выделенного места.

27
задан Omer Dagan 22 June 2015 в 08:30
поделиться

1 ответ

Я думаю, что у вас проблемы, потому что RedHat использует RPM для управления пакетами. Системы на основе Debian используют DEB, которые управляются с помощью таких инструментов, как apt.

1
ответ дан 28 November 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: