Разница между 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
. Почему существуют различия между двумя?
Ответы
Ответ 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. допустимы массивы нулевой длины. Они очень полезны в качестве последнего элемента структуры, который действительно является заголовком для объекта переменной длины.