Matriz com tamanho 0

Hoje eu incidentalmente defini um array bidimensional com o tamanho de uma dimensão sendo 0, porém meu compilador não reclamou. Eu encontrei o seguinte, que afirma que isso é legal, pelo menos no caso do gcc:

6.17 Matrizes de Comprimento Zero

No entanto, tenho duas perguntas sobre esse uso:

Primeiro, isso é considerado uma boa prática de programação? Se sim, então quando devemos usá-lo no mundo real?

Em segundo lugar, a matriz que eu defini era bidimensional, com tamanho 0 para uma dimensão. Isso é o mesmo que o caso unidimensional? Por exemplo,

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

Eles são todos iguais na memory e no compilador?

EDIT: Responder a Greg: O compilador que estou usando é gcc 4.4.5. Minha intenção para este problema não é dependente do compilador, no entanto, se houver alguma peculiaridade específica do compilador que seria útil também 🙂

Desde já, obrigado!

Em C ++, é ilegal declarar uma matriz de comprimento zero. Como tal, normalmente não é considerada uma boa prática, já que você está vinculando seu código a uma extensão específica do compilador. Muitos usos de matrizes dimensionadas dinamicamente são melhor substituídos por uma class de contêineres como std::vector .

ISO / IEC 14882: 2003 8.3.4 / 1:

Se a expressão constante (5.19) estiver presente, ela deve ser uma expressão constante integral e seu valor deve ser maior que zero.

No entanto, você pode alocar dinamicamente uma matriz de comprimento zero com o new[] .

ISO / IEC 14882: 2003 5.3.4 / 6:

A expressão em um declarator novo direto deve ter um tipo integral ou de enumeração (3.9.1) com um valor não negativo.

Eu corri este programa em ideone.com

 #include  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; } 

Ele deu o tamanho de todas as variables ​​como 0.

 sizeof(a) = 0 sizeof(b) = 0 sizeof(c) = 0 

Portanto, no exemplo acima, nenhuma memory é alocada para a , b ou c .

Compilando seu exemplo com o gcc, todos os três têm sizeof 0, então eu diria que todos eles são tratados igualmente pelo compilador.

Seu link explica tudo. Eles são usados ​​como último campo em uma estrutura quando o comprimento da estrutura não é conhecido em tempo de compilation. Se você tentar usá-los na pilha ou em meio a outras declarações, você acabará sobrescrevendo os próximos elementos.