Хобрук: Ваш путь к мастерству в программировании

Как поместить эту структуру в это динамически выделенное пространство?

Я работаю над проектом, который реализует алгоритм распределения друзей на C. Используя mmap(), я выделил 1 ГБ непрерывной памяти. Это выглядит так:

  char * base = mmap(NULL, MAX_MEM, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, 0, 0);

У меня есть структура, которую я пытаюсь разместить в этом пространстве. Структура выглядит следующим образом:

typedef struct Node {
    unsigned char header;
    struct Node *next;
    struct Node *prev;

}node;

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

void *ptr = (struct Node *) base + 512;
printf("base: %p\n", base);
printf("ptr: %p\n", ptr);

Мое окно терминала распечатывает это:

base: 0x102ef1000
ptr: 0x102ef4000

Но это не кажется правильным, потому что указатели находятся в памяти на расстоянии 12288 пробелов друг от друга, а не всего 512. Что я делаю неправильно?


  • эта строка: void ptr = ((struct Node *) base) + 512; должно быть: node *ptr = (node)((char )(base + 512)); хм, этот редактор продолжает сбрасывать '' в (узел*) 06.11.2014

Ответы:


1
void *ptr = (struct Node *) base + 512; 

означает ((struct Node *) base) + 512.

То, что вы хотите, это

void *ptr = (struct Node *) (base + 512);

Так вы пропускаете 512 байт с начала выделения.

Согласно сообщению, приведение имеет более высокий приоритет, чем добавление.

06.11.2014
  • Благодарю вас! Еще один вопрос, если не возражаете. Моя структура имеет свойство, называемое заголовком char, теперь, когда моя структура находится в этом динамически выделенном пространстве, как мне получить доступ к части заголовка? Я не могу сделать ptr.header, потому что это просто указатель. 06.11.2014
  • Вы можете преобразовать ptr в struct Node как ((struct Node*)ptr)->header or change the ptr` в тип struct Node * и выполнить ptr-›header. 06.11.2014

  • 2

    Помните, что когда вы приводите base к struct Node *, добавление к нему теперь добавит размер struct Node к указателю, поэтому вы добавляете к нему sizeof(struct Node) * 512. это, вероятно, не то, что вы хотите. Учитывая, что это 24-байтовая структура, это делает ее 24 * 512 = 12288.

    Причина, по которой он составляет 12 байт, заключается в том, что он содержит 2 указателя по 8 байтов, 1 байт char и 7 байтов заполнения, чтобы гарантировать, что указатели выровнены по 8 байтам.

    Чтобы решить эту проблему, просто опустите приведение, оно оставит базу как char * и увеличит ее на 512 байтов по желанию.

    void *ptr = base + 512; 
    
    06.11.2014
    Новые материалы

    ВЫ РЕГРЕСС ЭТО?
    Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

    Не зря же это называют интеллектом
    Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

    LeetCode Проблема 41. Первый пропущенный положительный результат
    LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

    Расистский и сексистский робот, обученный в Интернете
    Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

    Управление состоянием в микрофронтендах
    Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..

    Декларативное и функциональное программирование в стиле LINQ с использованием JavaScript с использованием каррирования и генератора ...
    LINQ - одна из лучших функций C #, которая обеспечивает элегантный способ написания кода декларативного и функционального стиля, который легко читать и понимать. Благодаря таким функциям ES6,..

    Структуры данных в C ++ - Часть 1
    Реализация общих структур данных в C ++ C ++ - это расширение языка программирования C, которое поддерживает создание классов, поэтому оно известно как C с классами . Он используется для..