Массив размером 0
Сегодня я случайно определил двухмерный массив с размером одного измерения, равным 0, однако мой компилятор не жаловался. Я нашел следующее, в котором говорится, что это законно, по крайней мере, в случае gcc:
6.17 Массивы нулевого нуля
Однако у меня есть два вопроса об этом использовании:
Во-первых, считается ли это хорошей практикой программирования? Если да, то когда мы должны использовать его в реальном мире?
Во-вторых, массив, который я определил, был двухмерным, с размером 0 для одного измерения. Это то же самое, что одномерный случай? Например,
int s[0]
int s[0][100]
int s[100][0]
Все ли они одинаковы в памяти и для компилятора?
EDIT: Ответ на Greg: Компилятор, который я использую, - gcc 4.4.5. Мое намерение для этой проблемы не зависит от компилятора, однако, если есть какие-то специфические особенности компилятора, которые также были бы полезны:)
Спасибо заранее!
Ответы
Ответ 1
В С++ запрещено объявлять массив нулевой длины. Как правило, это не считается хорошей практикой, поскольку вы связываете свой код с конкретным расширением компилятора. Многие применения массивов с динамическим размером лучше заменить на класс контейнера, например std::vector
.
ISO/IEC 14882: 2003 8.3.4/1:
Если присутствует константное выражение (5.19), оно должно быть интегральным постоянным выражением и его значение должно быть больше нуля.
Однако вы можете динамически выделять массив нулевой длины с помощью new[]
.
ISO/IEC 14882: 2003 5.3.4/6:
Выражение в direct-new-declarator должно иметь целочисленный или перечисляемый тип (3.9.1) с неотрицательным значением.
Ответ 2
Я запустил эту программу на ideone.com
#include <iostream>
int main()
{
int a[0];
int b[0][100];
int c[100][0];
std::cout << "sizeof(a) = " << sizeof(a) << std::endl;
std::cout << "sizeof(b) = " << sizeof(b) << std::endl;
std::cout << "sizeof(c) = " << sizeof(c) << std::endl;
return 0;
}
Он задал размер всех переменных как 0.
sizeof(a) = 0
sizeof(b) = 0
sizeof(c) = 0
Итак, в приведенном выше примере память не выделяется для a
, b
или c
.
Ответ 3
Компиляция вашего примера с gcc, все три из них имеют sizeof
0, поэтому я бы предположил, что все они одинаково обрабатываются компилятором.
Ответ 4
Ваша ссылка объясняет все. Они используются как последнее поле в структуре, когда длина структуры неизвестна во время компиляции. Если вы попытаетесь использовать их в стеке или в середине других объявлений, вы в конечном итоге перепишете следующие элементы.