Массив с размером 0

c++ c arrays gcc

25406 просмотра

4 ответа

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

6.17 Массивы длины ноль

Тем не менее, у меня есть два вопроса по этому использованию:

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

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

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

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

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

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

Автор: zw324 Источник Размещён: 12.11.2019 09:33

Ответы (4)


30 плюса

Решение

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

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

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

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

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

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

Автор: CB Bailey Размещён: 30.05.2011 07:43

3 плюса

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

Автор: Node Размещён: 30.05.2011 07:40

2 плюса

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

Автор: Kanopus Размещён: 30.05.2011 07:41

2 плюса

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

Автор: Piotr Praszmo Размещён: 30.05.2011 07:56
Вопросы из категории :
32x32