Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 14:03
Оценка:
Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?

int main()
{
    int arr[0];
}


gcc в режиме C++, msvc и Comeau ругаются, а вот gcc в режиме C считает, что всё валидно:

gcc 4.7.0 (C++)

error: ISO C++ forbids zero-size array 'arr' [-pedantic]


msvc (cl 17.0.50214.1)

error C2466: cannot allocate an array of constant size 0
error C2133: 'arr' : unknown size


Comeau 4.3.10.1 Beta2

"ComeauTest.c", line 3: error: the size of an array must be greater than zero


gcc 4.7.0 (C)

No errors


http://liveworkspace.org/code/ddbf7b89b612073245553a6ae9de9f18

Баг компилятора?
Re: Массивы нулевого размера
От: MasterZiv СССР  
Дата: 23.05.12 14:14
Оценка:
On 05/23/2012 06:03 PM, PlusMyTwitterFace wrote:

> Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой

> размерности?

Да.
Posted via RSDN NNTP Server 2.1 beta
Re: Массивы нулевого размера
От: Сыроежка  
Дата: 23.05.12 14:16
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?


PMT>
PMT>int main()
PMT>{
PMT>    int arr[0];
PMT>}
PMT>



Нельяз объявлять массив со значением размера равным 0.

If the constant-expression (5.19) is present,
it shall be an integral constant expression and its value shall be greater than zero.
Меня можно встретить на www.cpp.forum24.ru
Re[2]: Массивы нулевого размера
От: Сыроежка  
Дата: 23.05.12 14:30
Оценка:
Здравствуйте, Сыроежка, Вы писали:

С>Нельяз объявлять массив со значением размера равным 0.


С>If the constant-expression (5.19) is present,

С>it shall be an integral constant expression and its value shall be greater than zero.


Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."
Меня можно встретить на www.cpp.forum24.ru
Re: Массивы нулевого размера
От: Smooky Россия  
Дата: 23.05.12 14:48
Оценка:
gcc version 4.3.2 (Debian 4.3.2-1.1) скомпилил без проблем.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[2]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 14:52
Оценка:
S>gcc version 4.3.2 (Debian 4.3.2-1.1) скомпилил без проблем.

Я о том же. Вопрос заключается в валидности такого приёма.
Re[2]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 14:53
Оценка:
MZ>Да.

На каком основании сделано такое утверждение? Стандарт, опыт общения с ужасно написанным кодом (хотя, кому в голову придёт объявить массив нулевого размера, я не знаю) или что-то ещё?
Re[3]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 14:54
Оценка:
С>Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."

Т.е., получается, баг компилятора?
Re[3]: Массивы нулевого размера
От: Smooky Россия  
Дата: 23.05.12 15:04
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

S>>gcc version 4.3.2 (Debian 4.3.2-1.1) скомпилил без проблем в режиме С и С++.


PMT>Я о том же. Вопрос заключается в валидности такого приёма.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[4]: Массивы нулевого размера
От: Сыроежка  
Дата: 23.05.12 15:07
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

С>>Это я цитировал С++ стандарт, а в С99 стандарте написано то же самое: "If the expression is a constant expression, it shall have a value greater than zero."


PMT>Т.е., получается, баг компилятора?


Если рассматривать ваш пример

int main()
{
int arr[0];
}

то из мною процитированного следует, что это баг по крайней мере согдасно стандарту С99. Нужно было бы еще заглянуть в новый стандарт С от 2011 года.
Меня можно встретить на www.cpp.forum24.ru
Re[4]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 15:10
Оценка:
Честно говоря, не понял смысла в выделенном вами слове.

То, что приведённый выше код прекрасно компилируется при помощи gcc, я написал ещё в первом сообщении (правда, версия была поновее). Под "валидностью" в данном случае подразумевалось соответствие такого приёма стандартам языков C / C++.

Я вот как-то Comeau в плане соответствия стандарту больше доверяю, поэтому мнение gcc на этот счёт я учитываю немного меньше.
Re[5]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 15:11
Оценка:
С>Нужно было бы еще заглянуть в новый стандарт С от 2011 года.

Мне кажется, лучше уж посмотреть C89 / C90.
Re[6]: Массивы нулевого размера
От: Сыроежка  
Дата: 23.05.12 15:16
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

С>>Нужно было бы еще заглянуть в новый стандарт С от 2011 года.


PMT>Мне кажется, лучше уж посмотреть C89 / C90.


Могу вам предоставить интересуню ссылку, где обсуждается вопрос, имеющий также отношению к нулевому размеру массива.
Меня можно встретить на www.cpp.forum24.ru
Re[4]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 15:42
Оценка:
Или ошибки не было даже в режиме C++?
Re: Массивы нулевого размера
От: wander  
Дата: 23.05.12 15:53
Оценка: 17 (4)
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?

Нет.

PMT>Баг компилятора?

Нет.
Это фича.
Re: Массивы нулевого размера
От: watch-maker  
Дата: 23.05.12 15:55
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>стандарт языка C


PMT>а вот gcc в режиме C считает, что всё валидно


А как вы компилируете с помощью gcc?
У меня все версии gcc выдают ошибку:
$ gcc -c test.c -std=c99  -pedantic -Werror
test.c:3:9: error: ISO C forbids zero-size array 'arr'

Может просто забыли указать, что нужно следовать стандарту языка C?


PMT>Баг компилятора?


Если включены нестандартные расширения, то такие массивы допускаются (они были нужны пока в С99 не появились flexible array member). Если расширения не включены, а задано следование стандарту, то такой код не компилируется.
Re[2]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 16:01
Оценка:
WM>А как вы компилируете с помощью gcc?

gcc использовал в данном случае лишь на сайте liveworkspace.org

WM>Если включены нестандартные расширения, то такие массивы допускаются (они были нужны пока в С99 не появились flexible array member). Если расширения не включены, а задано следование стандарту, то такой код не компилируется.


Да, уже сказали ранее, но всё равно спасибо!
Re[2]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 23.05.12 16:02
Оценка:
W>Нет.
W>Это фича.

Спасибо!
Re[2]: Массивы нулевого размера
От: MasterZiv СССР  
Дата: 23.05.12 21:22
Оценка:
On 05/23/2012 06:14 PM, MasterZiv wrote:

>> Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой

>> размерности?
>
> Да.

Слушайте, я что-то всё путаю сегодня.

Массив нулевого размера не может быть.
Структура может быть "нулевого размера", но она на самом деле не будет физически
0-го размера.
Posted via RSDN NNTP Server 2.1 beta
Re: Массивы нулевого размера
От: 0xDEADBEEF Ниоткуда  
Дата: 23.05.12 22:18
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

С практической точки зрения: "А ни все ли равно"?
Лично я массивы воспринимаю как указатели, которые "компилятор неявно аллоцировал", естественно помня о том, где они "аллоцированы" и о небезграничности стека.
А в остальном, что указатель, что массив — в языке C (не C++) — один хрен, кроме sizeof, но я о нем помню.

И да, malloc(0) тоже не особо определен, по крайней мере в стандарте C-99
__________
16.There is no cause so right that one cannot find a fool following it.
Re[3]: Массивы нулевого размера
От: Сыроежка  
Дата: 23.05.12 22:47
Оценка:
Здравствуйте, MasterZiv, Вы писали:


MZ>Слушайте, я что-то всё путаю сегодня.


MZ>Массив нулевого размера не может быть.

MZ>Структура может быть "нулевого размера", но она на самом деле не будет физически
MZ>0-го размера.

Стандартный контейнер std::array эммулирует массивы с нулевым количеством элементов.
Меня можно встретить на www.cpp.forum24.ru
Re[5]: Массивы нулевого размера
От: Smooky Россия  
Дата: 24.05.12 11:06
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Или ошибки не было даже в режиме C++?


Да, ни в С ни в С++ небыло ошибок.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[3]: Массивы нулевого размера
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.05.12 11:24
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>На каком основании сделано такое утверждение? Стандарт, опыт общения с ужасно написанным кодом (хотя, кому в голову придёт объявить массив нулевого размера, я не знаю) или что-то ещё?


Массив нулевого размера идеоматически используется как последнее поле структуры переменного размера:
  struct cstring {
    unsigned int count;
    char         text[ 0 ];
  };
Re: Массивы нулевого размера
От: pugv Россия  
Дата: 24.05.12 12:37
Оценка: +1
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?


typedef struct {
    int result;
    ULONG fds;
    INT timeout;
    WSAPOLLFD fdArray[0];
} WSAPOLLDATA, *LPWSAPOLLDATA;


(с) MSWSock.h

Re[2]: Массивы нулевого размера
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 24.05.12 13:34
Оценка:
Здравствуйте, wander, Вы писали:

W>Здравствуйте, PlusMyTwitterFace, Вы писали:


PMT>>Чисто ради интереса — разрешает ли стандарт языка C использовать массивы нулевой размерности?

W>Нет.

PMT>>Баг компилятора?

W>Нет.
W>Это фича.
Более того, это имба-фича, на которой многое держится.
Sic luceat lux!
Re[4]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 24.05.12 13:46
Оценка:
Pzz>Массив нулевого размера идеоматически используется как последнее поле структуры переменного размера

Честно говоря, не совсем понимаю, зачем такое может понадобиться на практике.
Re[5]: Массивы нулевого размера
От: jyuyjiyuijyu  
Дата: 24.05.12 14:01
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Честно говоря, не совсем понимаю, зачем такое может понадобиться на практике.


многим системныи функциям передается блок памяти куда они должны записать результат
результат этот переменного размера для этого и нужны

typedef struct _SYSTEM_PROCESS_INFORMATION {
    ULONG            NextEntryDelta;
    ULONG            ThreadCount;
    ULONG            Reserved1[6];
    LARGE_INTEGER   CreateTime;
    LARGE_INTEGER   UserTime;
    LARGE_INTEGER   KernelTime;
    UNICODE_STRING  ProcessName;
    KPRIORITY        BasePriority;
    ULONG            ProcessId;
    ULONG            InheritedFromProcessId;
    ULONG            HandleCount;
    ULONG            Reserved2[2];
    VM_COUNTERS        VmCounters;
    IO_COUNTERS        IoCounters;
    SYSTEM_THREAD_INFORMATION  Threads[];
} SYSTEM_PROCESS_INFORMATION, * PSYSTEM_PROCESS_INFORMATION;
Re[5]: Массивы нулевого размера
От: Pzz Россия https://github.com/alexpevzner
Дата: 24.05.12 14:06
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

Pzz>>Массив нулевого размера идеоматически используется как последнее поле структуры переменного размера


PMT>Честно говоря, не совсем понимаю, зачем такое может понадобиться на практике.


Когда размер заранее не известен.
Re[3]: Массивы нулевого размера
От: ДимДимыч Украина http://klug.org.ua
Дата: 24.05.12 18:04
Оценка:
Здравствуйте, MasterZiv, Вы писали:

MZ>Структура может быть "нулевого размера", но она на самом деле не будет физически

MZ>0-го размера.

В языке C структура может быть нулевого размера, и на самом деле она физически будет нулевого размера.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[4]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 24.05.12 18:09
Оценка:
ДД>В языке C структура может быть нулевого размера, и на самом деле она физически будет нулевого размера.

Как это представить с точки зрения языка? Ведь причина, по которой в C++ не бывает структуры / класса нулевого размера (за одним-единственным исключением), насколько мне известно, связана с тем, что у каждого объекта должен быть уник. адрес.
Re[5]: Массивы нулевого размера
От: ДимДимыч Украина http://klug.org.ua
Дата: 26.05.12 15:28
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Как это представить с точки зрения языка? Ведь причина, по которой в C++ не бывает структуры / класса нулевого размера (за одним-единственным исключением), насколько мне известно, связана с тем, что у каждого объекта должен быть уник. адрес.


Так это в C++ должен быть, а в C не обязательно.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[6]: Массивы нулевого размера
От: PlusMyTwitterFace  
Дата: 27.05.12 07:05
Оценка:
ДД>Так это в C++ должен быть, а в C не обязательно.

Т.е. в C вполне возможна ситуация, когда в stdout окажется след. строка:

#include <stdio.h>

typedef struct Empty
{
} Empty_t;

int main()
{
    Empty_t a;
    Empty_t b;

    if (&a == &b)
    {
        printf("&a == &b");
    }

    return 0;
}


Верно?

Кстати, почему Comeau не компилирует данный код?

"ComeauTest.c", line 5: error: expected a declaration
Wild guess: Should this be in a function block?
} Empty_t;
^

Re[2]: Массивы нулевого размера
От: niXman Ниоткуда https://github.com/niXman
Дата: 27.05.12 11:20
Оценка:
Здравствуйте, watch-maker, Вы писали:
WM>У меня все версии gcc выдают ошибку:
WM>
$ gcc -c test.c -std=c99  -pedantic -Werror
WM>test.c:3:9: error: ISO C forbids zero-size array 'arr'
WM>

скажите, какой на какой версии компилятора проверяли?
дело в том, что на LWS используется 4.7.0, и после того как я добавил для Си режима ключик '-pedantic' — ничего не изменилось.
вот ключи используемые для Си режима: -Wall -W -std=c99 -pedantic

спасибо.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[7]: Массивы нулевого размера
От: ДимДимыч Украина http://klug.org.ua
Дата: 27.05.12 21:20
Оценка:
Здравствуйте, PlusMyTwitterFace, Вы писали:

PMT>Т.е. в C вполне возможна ситуация, когда в stdout окажется след. строка:

PMT>Верно?

Да.

PMT>Кстати, почему Comeau не компилирует данный код?

PMT>

PMT>"ComeauTest.c", line 5: error: expected a declaration
PMT> Wild guess: Should this be in a function block?
PMT> } Empty_t;
PMT> ^


gcc компилирует.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)