Pessoal,
int n;
int a[n];
Não deveria ser um erro de compilação?
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:
[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.