Em C ++, tentei declarar uma matriz global de algum tamanho. Eu recebi o erro:
O limite da matriz não é uma constante inteira antes do token ']'
Mas quando declarei uma matriz do mesmo tipo na main()
função, ela está funcionando bem.
Por que existe um comportamento diferente aqui?
int y=5;
int arr[y]; //When I comment this line it works fine
int main()
{
int x=5;
int arr2[x]; // This line doesn't show any error.
}
Edit: Muitos estão sugerindo que esta pergunta é uma duplicata do Obtendo o erro "array bound não é uma constante inteira antes do símbolo ']'" . Mas essa pergunta não responde por que há um comportamento diferente.
c++
variable-length-array
Syed Maqthyar
fonte
fonte
main
não sendo legal, ele usa a extensão VLA.main
for "aceito" pelo seu compilador: você está usando a extensão do compilador, que permite que os VLAs sejam compilados, mesmo que não sejam suportados pelo padrão C ++.y
ex
comoconst
? Você precisa modificar o valor dey
oux
? Espero que não, porque isso levanta muitas questões sobre o tamanhoarr
earr2
deve ser - principalmente no que diz respeito à ordem de inicialização. (Dica: eles devem ser constantes)--std=c++17
(ou--std=c++11
se for um compilador antigo) e a compilação falhará.Respostas:
Ambos os exemplos estão mal formados em C ++. Se um compilador não diagnosticar o último, ele não estará em conformidade com o padrão.
Você usa uma extensão de idioma que permite matrizes automáticas com duração de tempo de execução. Mas não permite matrizes estáticas de comprimento de tempo de execução. Matrizes globais têm armazenamento estático.
Caso você esteja usando o GCC, você pode solicitar que ele esteja em conformidade com o padrão usando a opção de linha de comando -pedantic. É uma boa idéia fazê-lo para ser informado sobre os problemas de portabilidade.
fonte
O tamanho de uma matriz deve ser uma constante. Você pode corrigir isso declarando
y
comoconst
.Quanto ao motivo pelo qual isso funcionou
main
, o g ++ permite uma matriz de comprimento variável no escopo do bloco como uma extensão. No entanto, não é C ++ padrão.fonte
Ambos não devem ser usados, funciona: porque (como @eerorika disse) matrizes automáticas de comprimento são permitidas em tempo de execução, mas as matrizes globais precisam ter armazenamento estático.
Se você deseja declarar uma matriz com um tamanho variável (por exemplo, dado por std :: cin), faria algo como:
Mas você não seria capaz de configurá-lo para conter apenas zeros com
float arr[n] = {0}
(se você precisar adicionar um valor na matriz, sem ter certeza de defini-lo), seria necessário usar um loop como essefonte
O sistema de tipos do C ++ lida com essas matrizes do tipo C da maneira que define
arr2
no seu exemplo de tipoint[5]
. Portanto, sim, o número de elementos da matriz faz parte do tipo!Isso coloca algumas restrições no que você tem permissão para usar na definição de matrizes do tipo C. Ou seja, esse número precisa ter armazenamento estático , precisa ser imutável e precisa estar disponível em tempo de compilação .
Portanto, convém alterar seu código para algo como o seguinte, que terá outro benefício. Inicializa a matriz de maneira adequada:
fonte