Я немного смущен относительно того, что это означает, что структура типа относится к некоторой ячейке памяти в массиве фиксированного размера, а затем хочет получить доступ к определенной ячейке памяти в пределах диапазон, используемый для структуры. Например:Кастинг типа 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 ячейке для каждого символа. Если у нас есть структура с несколькими разными типами данных, которые занимают несколько ячеек для каждого элемента структуры, и мы указываем на конкретную ячейку, что мы получаем?
Этот фрагмент демонстрирует неопределенное поведение, потому что требования к выравниванию 'struct header' могут быть больше, чем требования' char'. –
Вместо этого: 'headerptr = (struct header *) ((char *) p + sizeof (struct header));' вы можете просто сделать 'headerptr = p + 1;', поскольку тип 'p' является' struct header * '. –
@ м., Не могли бы вы уточнить? – user2644819