2013-12-09 1 views
0

Я немного смущен относительно того, что это означает, что структура типа относится к некоторой ячейке памяти в массиве фиксированного размера, а затем хочет получить доступ к определенной ячейке памяти в пределах диапазон, используемый для структуры. Например:Кастинг типа struct в ячейку памяти фиксированного размера

static char arraymemory[100]; 

struct header{ 
sruct header *previous, *successor; 
int isfree; 
int size; 
}; 

struct header *headerptr; 

headerptr= (struct header*)((char*)p + sizeof(struct header)); 

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

Итак, я проверил, и sizeof (struct header) составляет 24 байта. Теперь у меня есть массив символов с 1 байтом каждый, поэтому 1 * 100 = размер массива. Я беру указатель p, который находится в начале массива и перемещает его на 24 байта (независимо от того, где находится память), на что указывает headerptr. Если я объявляю, что headerptr-> isfree и headerptr-> size равны чему-то наряду с тем, что указатели предыдущие и преемники содержат ячейку памяти, означает ли это, что от того, где headerptr указывает не более чем на 24 байта после того, как будет использоваться для структуры и его членов?

Второй вопрос, предполагая, что ответ на этот вопрос да, что произойдет, если я получаю доступ к ячейке памяти headerptr + 3? Было бы легко увидеть результат, если значение типа данных с равным символом, такое как «a», находилось в этой конкретной ячейке памяти, потому что заголовочный файл +2 или headerptr +3 дал вам 1 байтовый символ для чтения. Но как это работает, если вы использовали весь этот диапазон для структуры и получаете доступ к определенной ячейке памяти этого набора. Вы получили бы доступ к одному из членов структуры? Некоторые типы принимают более 1 байта (char), например int, который принимает 4. Предполагая, что member isfree является первым, объявленным в структуре, и это первое, что указывает headerptr, что читает данные внутри памяти headerptr + 3 дают? Значение isfree независимо от того, где в 4 байтах мы указываем? Мне трудно представить это, потому что, когда я рисую массив символов, я просто думаю о 1 ячейке для каждого символа. Если у нас есть структура с несколькими разными типами данных, которые занимают несколько ячеек для каждого элемента структуры, и мы указываем на конкретную ячейку, что мы получаем?

+0

Этот фрагмент демонстрирует неопределенное поведение, потому что требования к выравниванию 'struct header' могут быть больше, чем требования' char'. –

+0

Вместо этого: 'headerptr = (struct header *) ((char *) p + sizeof (struct header));' вы можете просто сделать 'headerptr = p + 1;', поскольку тип 'p' является' struct header * '. –

+0

@ м., Не могли бы вы уточнить? – user2644819

ответ

0

Ваши вопросы имеют смысл только при условии, что p достаточно выровнены, которая не гарантируется, если p указывает на начало char массива, так что давайте предположим struct header *p = malloc(100); (указатель возвращается, если распределение преуспевает соответствующим образом выровнены для любого типа) ,

Но во-первых, есть такая странная формулировка в вашем посте:

SizeOf (заголовок структура) является количество байт самой структуры плюс членов.

сама структура уже содержит его членов, так что в плюс члены не имеет смысла.

Если я объявляю headerptr-> isfree и headerptr-> размер равен чему-то наряду с наличием указателей предыдущими и правопреемником держать в себя память местоположения, это означает, что это от того, где точек headerptr на до в наиболее 24 байта после будет использоваться для структуры и ее членов?

Чтобы быть точным, это будет байт headerptr точек до 23 байт после, всего 24 байта.

Что произойдет, если я получу доступ к ячейке памяти headerptr + 3?

Поскольку headerptr имеет тип struct header * и 24 байт от начала выделенной памяти, headerptr + 3 составляет 72 байта после того, как, я. е. 96 байт с самого начала. Теперь, что происходит, зависит от того, как вы получаете доступ к этому местоположению.

Было бы легко увидеть результат, если обычный значение символьного типа данных , такие как «а» в то определенном месте памяти, поскольку headerptr +2 или headerptr +3 даст вам 1 байт полукокса в читать. Но как это работает , если вы использовали весь этот диапазон для структуры, и вы получаете доступ к определенному местоположению памяти этого набора . Вы получили бы доступ к одному из членов структуры?

Когда вы пишете headerptr +3, вы, кажется, имеете в виду (char *)headerptr + 3; Я буду считать, что отсюда. Кроме того, доступ отдельных байтов объекта размером более 1 безопасен только с типом unsigned char. Таким образом, мы получим доступ к одному байту одного из членов структуры.

Предполагая, что член isfree является первым, что объявленный в структуры и это первая вещь, которая headerptr указывает на то, что делает чтение данных в памяти headerptr + 3 дают?

((unsigned char *)headerptr)[3] затем дает значение четвертого байта isfree, при условии, что sizeof isfree по меньшей мере 4.

Если мы имеем-структуру с несколькими различным типом данных, которые занимают несколько ячеек для каждого членов структуры, и мы указываем на конкретную ячейку , что мы получаем?

Получаем то, о чем мы просим, ​​- один байт или ячейку или (однобайтовый) символ, как в приведенном выше примере.

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