LINUX.ORG.RU

Странность с массивом нулевой длины в C++

 , ,


0

3
struct A
{
    int arr[];
};

int main()
{
    A a[5];
    std::cout << sizeof(a) << std::endl;
    return 0;
}
$ g++ -std=c++14 test1.cpp -o test1 && ./test1
0

Притом:

struct A
{
    int arr[];
};

int main()
{
    struct A a[5];
    printf("%d", sizeof(a));
    return 0;
}
$ gcc -std=c99 test.c -o test1
test.c:7:5: error: flexible array member in otherwise empty struct
 int arr[];
     ^
Почему так? Исходя из https://en.wikipedia.org/wiki/Flexible_array_member и моих представлений о стандарте C++ и C, все должно быть наоборот.

Ответ на: комментарий от andreyu

Ну и форматную строку нужно исправить, sizeof возвращает не int.

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Так вопрос то, почему в C++ это вообще компилируется (самое непонятное), и почему sizeof - 0, хотя у пустой структуры - 1.

CatsCantFly
() автор топика
Последнее исправление: CatsCantFly (всего исправлений: 2)

Вроде как нарушение стандарта. Как минимум структура не может быть размера 0 (как раз ради массивов и задумано).

Попробуй в студии собрать, если там так же видимо надо читать стандарт, если нет можно на дурика записать багу в gcc:)

pon4ik ★★★★★
()
Ответ на: комментарий от CatsCantFly

Какое-нибудь расширение gcc. Проверять лень.

anonymous
()
$ g++ -std=c++14 -pedantic zero-len-array.cpp
zero-len-array.cpp:5:13: warning: ISO C++ forbids zero-size array ‘arr’ [-Wpedantic]
     int arr[];
             ^

С C99 ошибка так как структура не может состоять из одного только flexible array, перед ним должно быть какое-нибудь поле.

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)

Шестая и седьмая версии g++ выдают 1.

anonymous
()

VC++14:

>cl -EHsc -O2 t1.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.00.24210 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

t1.cpp
t1.cpp(10): error C2233: 'a': arrays of objects containing zero-size arrays are illegal

clang-3.9.0:

>clang++ -std=c++14 -Wall -Weverything -Wno-c++98-compat -O2 t1.cpp
t1.cpp:5:9: warning: flexible array member 'arr' in otherwise empty struct is a Microsoft extension
      [-Wmicrosoft-flexible-array]
    int arr[];
        ^
t1.cpp:5:9: warning: flexible array members are a C99 feature [-Wc99-extensions]
t1.cpp:10:8: warning: 'A' may not be used as an array element due to flexible array member
      [-Wflexible-array-extensions]
    A a[5];
       ^
3 warnings generated.
Но скомпилировал и выдал значение 20.

gcc-6.2.0:

> g++ -std=c++14 -O3 -Wall t1.cpp
t1.cpp:5:13: error: flexible array member 'A::arr' in an otherwise empty 'struct A'
     int arr[];
             ^
t1.cpp:3:8: note: in the definition of 'struct A'
 struct A
        ^

eao197 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.