Array em c++

Pessoal,

int n;
int a[n];

Não deveria ser um erro de compilação?

Depende do compilador.

O GCC aceita, mas na hora de executar da erro por que não inicializou n (C++). Testei em um código C e mesmo na execução não ocorre o erro.
O compilador do Visual Studio 2010 (última versão) não aceita, mesmo que você inicialize n.

Acho que o vilão da história se chama ISO C99:

http://gcc.gnu.org/onlinedocs/gcc/Variable-Length.html

[quote=rodrigo.bossini]Pessoal,

int n;
int a[n];

Não deveria ser um erro de compilação?[/quote]

Não porque a sintaxe está correta. O g++ que é o compilador de c++( gcc é o compilador de c) adverte que n não foi inicializado. Isso é um erro de lógica.

C:\Users\Julio\Documents\Qt\SmartPointer-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK__Debug…\SmartPointer\main.cpp:27: warning: ‘n’ may be used uninitialized in this function

Existe uma ferramenta opensource que detecta armadilhas como memory leaks, apontadores selvagens( que não foram inicializados e apontam para qualquer lugar). Ela se chama valgrind.

http://valgrind.org/
http://valgrind.org/docs/manual/QuickStart.html

Por isso que nessas horas, em termos de C++, prefiro o bom e velho std::vector<int>

[quote=juliocbq][quote=rodrigo.bossini]Pessoal,

int n;
int a[n];

Não deveria ser um erro de compilação?[/quote]

Não porque a sintaxe está correta. O g++ que é o compilador de c++( gcc é o compilador de c) adverte que n não foi inicializado. Isso é um erro de lógica.

C:\Users\Julio\Documents\Qt\SmartPointer-build-desktop-Qt_4_8_0_for_Desktop_-_MinGW__Qt_SDK__Debug…\SmartPointer\main.cpp:27: warning: ‘n’ may be used uninitialized in this function

Existe uma ferramenta opensource que detecta armadilhas como memory leaks, apontadores selvagens( que não foram inicializados e apontam para qualquer lugar). Ela se chama valgrind.

http://valgrind.org/
http://valgrind.org/docs/manual/QuickStart.html[/quote]

Veja o que diz o site cplusplus.com:

“NOTE: The elements field within brackets [] which represents the number of elements the array is going to hold, must be a constant value, since arrays are blocks of non-dynamic memory whose size must be determined before execution.”

Se o tamanho deve ser determinado antes da execução então quem o determina só pode ser o compilador. Assim, a sintaxe exibiria um erro de compilação. O que acontece é que alguns compiladores oferecem extensões com base na ISO C99 que permitem essa sintaxe. Por debaixo dos panos, porém, suspeito que o compilador traduza esse código para uma chamada a malloc, por exemplo, já que obviamente com essa sintaxe não podemos ter alocação estática.

Então Vini, só surgiu essa dúvida por que um dos meus alunos me mostrou esse código e garantiu que não teve problemas com ele. Por um momento cheguei a pensar que eu não sabia do que tava falando. kkkk

Claro, é sempre bom saber o porque das coisas. :slight_smile: