2014-12-03 2 views
2

Я очень новичок в C/C++, поэтому я знаю, что этот вопрос, вероятно, тривиальный, но я не понимаю, как действовать дальше. Я выделил блоки памяти, которые по 512 байт каждые, как так (сектор является структурой размера 512 байт): char* block = (char *) malloc (sizeof(Sector));Объявление нескольких структур и их наложение на уже выделенную память

У меня есть другая структура, которая является 128 байтами:

typedef struct inode { 
int fileSize; 
int fileType; 
int* blockPointer[30]; 
} inodeFile; 

Я хочу сделать наложение этой структуры на блок. Мне нужно, чтобы каждый блок содержал 4 inode-структуры, но каждая структура может не иметь никаких связанных с ней значений до тех пор, пока в программе не появится. Так, например:

((*inodeFile) block)->fileSize = 10;

Если я правильно понять, это установка первые 4 байта указателя блока к FileSize. Я буду продолжать делать это для каждого поля структуры.

Вопрос в том, как я могу это сделать для 4 разных инодов? И поскольку существует 4 разных inodes, как я могу вернуть значения каждого поля для разных структур? Кажется, просто сказать, что block-> fileSize не будет работать, потому что может быть до четырех разных размеров файлов.

+0

Почему не '(((* inodeFile) блок) +1) -> FileSize = 10;' (кроме неизбежно сталкиваясь с жесткими проблемами наложения спектров с этой схемой) – IdeaHat

+0

Вы рассмотрели достоинства 'ЬурейеГо объединение InodeSector {секторный сектор; inodeFile inodes [4]; } InodeSector; '(с вашей предпочтительной последовательной схемой именования/верблюда/подчеркнутой именования)? На мой взгляд, 'Сектор' и' inodeFile' являются непоследовательными, но согласованность выгодна. С помощью 'union' вы можете получить доступ к данным как к сектору, так и к массиву с 4' inodeFile'. Возможно, вам все еще нужно знать о строгом псевдониме. –

+1

Попробуйте '((inodeFile *) block) [0] .fileSize = 10;' (звездочка на другой стороне имени типа и используя '[]' для разыменования, чтобы вы могли легко получить доступ к 2-м, 3-му и 4-му изменение индекса на 1, 2 или 3). – Dmitri

ответ

0

Вы можете использовать union для наложения блоков на сектора. Поскольку поля имеют тип int или указатель или размер 512, проблема с выравниванием не должна возникать, если естественный размер 32-разрядный.

typedef struct { 
    int fileSize; 
    int fileType; 
    int* blockPointer[30]; 
} inode; 

typedef union { 
    unsigned char bytes[512]; 
    inode block[4]; 
} sector; 

int main() 
{ 
    sector thisec; 
    thisec.bytes[511] = 0; 
    thisec.block[0].fileSize = 10; 
    return 0; 
} 
+0

thisec.bytes [511] = 0; является излишним. Возможно, вы хотели сказать: memset (& thissect, 0, sizeof thissect); ? –

+0

Это пример, я собирался поставить 'fread()', но я не знаю, откуда OP получает данные блока. –

+0

Во всяком случае, это не 'thissect' это' thisec'. Я написал индекс 511, чтобы показать работу компиляции, но я не пытаюсь вмешиваться в поле 'fileSize'. –

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