Пустое * пространство в структуре вместо malloc - PullRequest
1 голос
/ 27 февраля 2012

У меня сейчас есть структура

typedef struct Entry {
    int counter;
    void *block;
} Entry;

и блок памяти mmap

void *memPtr = mmap(NULL, someSize*1024, PROT_READ|PROT_WRITE, 
                        MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

, который я затем все время добавляю в первую часть (что глупо, но эта часть немного неактуальна) как таковой:

int AddEntry(void *data) {
   Entry entry;
   entry.counter = 1;
   entry.block = malloc(sizeof(char *) * SECTOR_SIZE);
   memcpy(entry.block, data, SECTOR_SIZE);
   memcpy(&memPtr[0], &entry, sizeof(Entry));
   return 0;
}

Проблема здесь в том, что длина Entry составляет всего 16 байтов, поскольку block - это void pointer. Каков наилучший способ убедиться, что блок действительно имеет размер sizeof (char *) * SECTOR_SIZE и на самом деле имеет достаточно места для данных, и как можно загрузить data в entry.block?

Спасибо!

1 Ответ

5 голосов
/ 27 февраля 2012

Если я правильно читаю вопрос, вы спрашиваете, как получить непрерывный блок памяти, к которому можно получить доступ (меньшим) Entry *

Самый распространенный способ - это определитьструктура типа: typedef struct Entry { int counter; unsigned char block[1]; }

В зависимости от поведения вашего компилятора вы также можете определить блок как массив нулевой длины.

Затем вы можете распределить пространство, необходимое для структуры, иSECTOR_SIZE: int AddEntry(void *data) { Entry *entry; entry = malloc(sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char)); // obligitory NULL checks assumed here</p> <p>// fill in structure entry->counter = 1; memcpy(entry->block, data, SECTOR_SIZE); memcpy(&memPtr[0], &entry, sizeof(Entry) + ((SECTOR_SIZE-1) * sizeof(unsigned char)); return 0; }

Это также позволит вам получить доступ, скажем, к 78-му байту block по: entry->block[77]

...