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

Разница между sizeof (пустая структура) и sizeof (struct with empty array)?

У меня есть две структуры, которые определены следующим образом:

struct EmptyStruct{

};

struct StructEmptyArr{
    int arr[0];
};

int main(void){
    printf("sizeof(EmptyStruct) = %ld\n", sizeof(EmptyStruct));
    printf("sizeof(StructEmptyArr) = %ld\n", sizeof(StructEmptyArr));

    return 0;
}

Скомпилирован с gcc (g++) 4.8.4 на Ubuntu 14.04, x64.

Выход (для gcc и g++):

sizeof(EmptyStruct) = 1
sizeof(StructEmptyArr) = 0

Я понимаю, почему sizeof(EmptyStruct) равно 1, но не может понять, почему sizeof(StructEmptyArr) равно 0. Почему существуют различия между двумя?

4b9b3361

Ответ 1

В C поведение программы undefined, если структура определена без какого-либо именованного члена.

C11-§6.7.2.1:

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

GCC допускает пустую структуру как расширение и ее размер будет 0.


Для С++ стандарт не разрешает объект размером 0 и, следовательно, sizof(EmptyStruct) возвращает значение 1. < ш > Массивы нулевой длины не поддерживаются стандартным С++ ¹, но поддерживаются как расширение GNU, а оператор sizeof возвращает 0 если применяется.


1. § 8.5.1-сноска 107) С++ не имеет массивов нулевой длины.

Ответ 2

https://gcc.gnu.org/onlinedocs/gcc/Empty-Structures.html

g++ обрабатывает пустые структуры, как если бы у них был единственный член типа char.

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

В GNU C. допустимы массивы нулевой длины. Они очень полезны в качестве последнего элемента структуры, который действительно является заголовком для объекта переменной длины.