Массив размером 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

Ваша ссылка объясняет все. Они используются как последнее поле в структуре, когда длина структуры неизвестна во время компиляции. Если вы попытаетесь использовать их в стеке или в середине других объявлений, вы в конечном итоге перепишете следующие элементы.