Массив с размером 0 - PullRequest
32 голосов
/ 30 мая 2011

Сегодня я случайно определил двумерный массив с размером одного измерения, равным 0, однако мой компилятор не жаловался. Я нашел следующее, в котором говорится, что это законно, по крайней мере, в случае с gcc:

6.17 Массивы нулевой длины

Однако у меня есть два вопроса об этом использовании:

Во-первых, это считается хорошей практикой программирования? Если так, то когда мы должны использовать это в реальном мире?

Во-вторых, определенный мной массив был двухмерным, с размером 0 для одного измерения. Это то же самое, что и одномерный случай? Например,

int s[0]
int s[0][100]
int s[100][0]

Они все одинаковы в памяти и для компилятора?

РЕДАКТИРОВАТЬ: Ответ Грегу: компилятор, который я использую, это gcc 4.4.5. Мое намерение решить эту проблему не зависит от компилятора, однако, если есть какие-то специфические особенности компилятора, которые также будут полезны:)

Заранее спасибо!

Ответы [ 4 ]

30 голосов
/ 30 мая 2011

В C ++ нельзя объявлять массив нулевой длины. Таким образом, это обычно не считается хорошей практикой, поскольку вы привязываете свой код к определенному расширению компилятора. Многие виды использования массивов динамического размера лучше заменить классом контейнера, таким как std::vector.

ИСО / МЭК 14882: 2003 8.3.4 / 1:

Если присутствует константное выражение (5.19), оно должно быть интегральным константным выражением, и его значение должно быть больше нуля.

Однако вы можете динамически выделить массив нулевой длины с помощью new[].

ИСО / МЭК 14882: 2003 5.3.4 / 6:

Выражение в direct-new-объявителе должно иметь целочисленный тип или тип перечисления (3.9.1) с неотрицательным значением.

3 голосов
/ 30 мая 2011

Я запустил эту программу на 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.

память не выделена.
2 голосов
/ 30 мая 2011

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

2 голосов
/ 30 мая 2011

Компилируя ваш пример с помощью gcc, все три имеют sizeof 0, поэтому я предполагаю, что все они одинаково обрабатываются компилятором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...