
paulo1205
(usa Ubuntu)
Enviado em 26/05/2014 - 16:34h
Se funciona ou não depende da versão do padrão do C (ou C++, se você estiver usando C++ para compilar).
Com o padrão do C de 1989 (ANSI C, também conhecido como ISO C 1990, C89 ou C90), essa construção não existia, mas não sei se era estritamente proibida.
Com o padrão do C de 1999 (ISO C 1999, ou C99) ou com o de 2011 (ISO C 2011, ou C11, se bem que no C11 é considerado um recurso opcional), criou-se a figura do
array de tamanho variável (
variable length array ou VLA), que é alocado automaticamente a partir do ponto da declaração e também é automaticamente desalocado quando a execução sai do bloco em que ele foi declarado.
Mesmo que um compilador não implemente o C99 nem o C11, pode ser que VLAs existam como uma extensão ao padrão C89. No entanto, é possível também que o compilador aceite
compilar o código em questão, pois de fato não há erro de sintaxe, mas o código gerado não seja exatamente correto.
Nenhuma das versões padronizadas do C++ (C++98, de 1998, e C++11, de 2011) suporta VLAs, porque funcionalidade equivalente é oferecida, com vantagens, por classes da biblioteca padrão. Mas isso não impede que compiladores implementem VLAs ao estilo do C.
Uma coisa que eu sempre recomendo, tanto a novatos quanto aos já experientes, é que liguem todas opções de diagnóstico de código do compilador, pois ele muitas vezes é capaz de apontar código potencialmente perigoso ou que possa gerar incompatibilidades. Além disso, é bom saber com muita clareza qual versão da padrão linguagem está sendo usada para compilar o código fonte.
No caso do GCC e do G++, as opções de diagnóstico que eu sempre recomendo são "-Wall -Werror -O2"; às vezes, acrescento também "-pedantic" a essa lista.
Quanto ao padrão da linguagem e eventuais extensões, o
default do GCC é (ou era, até a versão 4.6, que é a que eu tenho na minha máquina) se comportar como um C89 com extensões, quando se usa C, e como C++98 com extensões, quando se usa C++, e ambas entendem VLAs.
A opção "-std=" controla a versão da linguagem e extensões que deve ser usada. Curiosamente, não basta especificar "-std=c89" para, a título de teste, desabilitar VLAs: deve-se também incluir a opção de compilação "-pedantic".