Подтвердить что ты не робот

Структура нулевого размера

Я заметил, что при компиляции с GCC 4.6 sizeof(Foo) равен 0 и sizeof(Bar) равно 1. По какой-то причине добавление пустого массива в пустую структуру делало его размер 0. Я думал, что размеры обеих структур должны быть одна и та же. Что здесь происходит?

struct Foo
{
    char x[];
};

struct Bar {};
4b9b3361

Ответ 1

Объявление стандарта struct не разрешено стандартом C. 6.7.2.1 (8) в n1570:

Если список struct-declaration-list не содержит никаких именованных членов, напрямую или через анонимную структуру или анонимный союз, поведение не определено.

И пункт 18 в том же разделе:

В качестве частного случая последний элемент структуры с более чем одним именованным элементом может иметь неполный тип массива; это называется элементом гибкого массива. В большинстве ситуаций элемент гибкого массива игнорируется. В частности, размер структуры выглядит так, как если бы исключаемый элемент массива был исключен, за исключением того, что он мог иметь более длинную прописку, чем подразумевалось бы упущение.

(акцент мой)

Гибкие элементы массива не допускаются на С++, поэтому код также недействителен С++.

Поскольку это недопустимый код, значения, указанные sizeof для них, не имеют смысла.

Ответ 2

Оператор sizeof никогда не дает 0, даже для пустого класса.

как вы можете видеть здесь, в msdn

кроме того, msdn указывает:

Оператор sizeof не может использоваться со следующими операндами:

  • Функции. (Тем не менее, sizeof может применяться к указателям на функции.)
  • Поля бит.
  • Undefined.
  • Тип void.
  • Динамически распределенные массивы.
  • Внешние массивы.
  • Неполные типы.
  • Обозначенные имена неполных типов.

Ответ 3

C и С++ не допускают объекты нулевого размера.

gcc поддерживает их как расширение. Если вы скомпилируете нужные параметры, например

gcc -std=c99 -pedantic -Wall -Wextra

gcc по крайней мере предупредит вас о них; g++ имеет похожие варианты.