Дополнение структуры может безопасно использоваться пользовательским кодом?

Принятие у меня есть структура как следующее:

struct Struct {
    char Char;
    int Int;
};

и sizeof( int ) больше, чем один и компилятор добавляют дополнение для Char членская переменная - сгенерированному компилятором коду позволяют изменить значения дополнительных байтов?

Я имею в виду, использую ли я адресную арифметику с указателями и пишу некоторые данные в дополнительные байты, окружающие Char членская переменная и позже делает variable.Char = присвоение - это возможный, что код, сгенерированный компилятором, также перезапишет некоторые дополнительные байты?

6
задан sharptooth 6 January 2010 в 13:44
поделиться

4 ответа

Следующее предложение является неправильным: Нет, оно не перезапишет байты подкладки. Но, вероятно, это не является хорошей практикой. Если вам это нужно, добавьте туда переменные-члены.

Я исследовал, основываясь на комментариях, указывающих (правильно) на то, что я глуп:

У С-стандарта есть "Приложение J" с разделом J.1 Неопределенное поведение. В нем сказано: "Значение байтов подкладки при хранении значений в структурах или объединениях". Подразумевается, что компилятор может генерировать любые инструкции по записи данных в структуру, что может позволить ему перезаписывать заполнение после члена.

10
ответ дан 8 December 2019 в 03:39
поделиться

- там точно что-то можно написать, а memset - экземпляр такой структуры делает это. Однако, это небезопасно и никогда не является хорошей идеей делать это . Как-нибудь другой разработчик где-нибудь помещает #pragma или добавляет член для структурирования объявления, и ваш код взорвется множеством странных и причудливых способов, что может занять довольно много времени на отладку.

4
ответ дан 8 December 2019 в 03:39
поделиться

Единственная причина для этого - что-то вроде плагина, злонамеренно заставляющего хост-приложение хранить дополнительные данные.

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

1
ответ дан 8 December 2019 в 03:39
поделиться

Что, если бы компилятор был достаточно умен, чтобы использовать слово write для сохранения char? Ваши тщательно сохраненные данные будут потеряны. ;-)

.
13
ответ дан 8 December 2019 в 03:39
поделиться