Subscrito de vetor C ++ fora do intervalo erro

Subscrito de vetor C ++ fora do intervalo erro
Quando um erro de fora do alcance subscrito é emitido por um programa C ++, o subscrito usado para acessar um elemento do vetor está fora do intervalo dos índices vetoriais. No entanto, isso depende do compilador. Com o compilador G ++ para o Ubuntu, quando o subscrito está fora do intervalo, o valor padrão ou algum outro valor é retornado ou entendido como estar lá na célula. Isso só acontece quando o vetor já está definido com alguns elementos. Com o compilador G ++, quando o vetor é declarado sem nenhum elemento, e é feita uma tentativa de acessar um local de memória relacionado (sem nenhum elemento nele), usando qualquer número inteiro subscrito (mesmo 0), o compilador G ++ emite o erro: “ Falha de segmentação (despejo de núcleo)".

Antes de continuar a ler, é necessário recordar o seguinte: Um subscrito é o índice entre colchetes para o nome do vetor. Este índice é usado para referir o elemento do vetor. Cada índice refere -se a um determinado elemento (valor). A contagem do índice começa a partir de 0 e termina em Vettorsize - 1. Portanto, se um vetor tiver 10 elementos, o primeiro elemento está no índice 0 e o décimo elemento está no índice 9. Usando o índice 10 no vetor para ler ou alterar o valor de um elemento no índice 10, que não existe, deve gerar uma mensagem de erro fora de alcance. No entanto, com o compilador G ++, desde que um vetor tenha sido definido (a memória alocada para os elementos, mesmo que sejam elementos padrão), quando um índice fora do intervalo é usado, o valor padrão do tipo de elemento vetorial ou algum outro outro O valor do tipo é retornado (ou está lá para ser alterado).

Ilustração fora do alcance

Considere a tabela a seguir:

A B C D E F G H EU J
-2 -1 0 1 2 3 4 5 6 7 8 9 10 11

A primeira linha mostra como dez alocações de memória foram feitas para 10 caracteres. Abaixo dos caracteres da tabela, na segunda linha, estão os subscritos corretos (índices). Usando o subscrito -1, -2, -3, etc., deve resultar em erro fora de alcance emitido. Usando o subscrito 10, 11, 12, etc., também deve resultar em erro fora de alcance emitido.

Este artigo ilustra situações nas quais os erros fora da faixa são emitidos. O compilador usado para as amostras de código neste artigo é o compilador G ++ para o Ubuntu. Não se esqueça de incluir a biblioteca vetorial no programa, para qualquer compilador.

Erro fora do alcance para vetor definido

Um vetor definido é aquele para o qual a memória foi alocada para os elementos iniciais. Os valores podem ser valores padrão ou práticos para o tipo de elemento vetorial. Um vetor declarado sem qualquer forma de inicialização não é um vetor definido. Para esse vetor, não há alocação de memória para qualquer elemento vetorial. Esse vetor está vazio.

Compilador G ++ para Ubuntu

Suponha que haja dez elementos em um vetor; Um erro não incomum cometido por pessoas inexperientes na programação, é acessar o décimo elemento com o subscrito de 10. Deve ser acessado com o subscrito de 9, pois a contagem de índices começa de 0. Considere o seguinte programa com 10 elementos no vetor e o acesso ao décimo elemento com o índice de 10:

#incluir
#incluir
usando namespace std;
int main ()

vetorvtr = 'a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'j';
char ch = vtr [10]; // Declaração de erro
cout<retornar 0;

Este programa com o compilador G ++ para o Ubuntu fornece uma saída de ", que é um personagem de nada (sem espaço). Um personagem de nada é o personagem padrão para os caracteres em C++. Não há décimo primeiro termo para este vetor. Portanto, a segunda declaração é uma declaração de erro que não é detectada pelo compilador G ++. Com o compilador G ++, ele ainda não é detectado em tempo de execução, e o programa opera incorretamente.

Alguns outros compiladores

Quando o programa acima é usado com alguns outros compiladores, a declaração de erro é detectada em tempo de execução e uma exceção é lançada com uma mensagem de erro emitida na saída. O erro ainda não é detectado no momento da compilação, embora.

Considere a seguinte declaração:

vetor vtr (10);

Isso pode não parecer uma definição, mas é uma definição. Existem dez locais de memória para os dez elementos vetoriais com o valor padrão do caractere.

Erro fora de alcance para vetor indefinido

Um vetor declarado sem qualquer forma de inicialização não é um vetor definido. Para esse vetor, não há alocação para nenhum elemento vetorial. Esse vetor está vazio.

Compilador G ++ para Ubuntu

Quando um vetor declarado não possui inicialização (ou não tem valores padrão), o uso de subscrito não é aplicável ao vetor no acesso a qualquer elemento do vetor, pois não há não. Mesmo o índice zero não pode ser usado para acessar o primeiro elemento, que não está presente. No programa a seguir, é feita uma tentativa de acessar o primeiro elemento, que não está presente:

#incluir
#incluir
usando namespace std;
int main ()

Vectorvtr;
char ch = vtr [0]; // Declaração de erro
cout<retornar 0;

A primeira declaração na função principal declara um vetor sem qualquer local de memória para qualquer um de seus elementos. Esta afirmação não é uma definição. A segunda declaração tenta ler o valor no índice 0. Esta é uma declaração de erro porque o vetor não tem elemento e, portanto, nenhum elemento está presente em nenhum índice zero.

Com o compilador G ++, o programa compila com sucesso, mas em tempo de execução, quando a segunda declaração na função principal é alcançada, o programa para e a seguinte mensagem de erro é emitida:

falha de segmentação (despejo de núcleo)

Alguns outros compiladores

Execução do programa acima em outros compiladores, e observando que suas mensagens de erro correspondentes são deixadas como um exercício ao leitor.

Conclusão

O erro do subscrito vetorial ocorre quando uma tentativa é feita para acessar um elemento vetorial usando um subscrito que está fora do intervalo de índice. O erro fora de alcance não é o mesmo que a falha de segmentação (Core Dumped) o tempo todo.