Logo Hardware.com.br
João Victor Ribeiro Ferro
João Victor... Novo Membro Registrado
2 Mensagens 0 Curtidas

Dúvida em C e C++ vetor

#1 Por João Victor... 02/08/2017 - 09:12
Pq em c e c++ eu consigo acessar indices maiores que o meu vetor tem? E pq se eu omitir o indice não funciona?
ex do código:
[HASHTAG]#include[/HASHTAG]
using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
int vetor [3];

vetor [0]= 3;
vetor [1]= 5;
vetor [2]= 6;
vetor [3]= 8;
vetor [4]= 9;
vetor [5]= 2;

cout << vetor [0] << "\n";
cout << vetor [1] << "\n";
cout << vetor [2] << "\n";
cout << vetor [3] << "\n";
cout << vetor [4] << "\n";
cout << vetor [5] << "\n";

return 0;

}
TerraSkilll
TerraSkilll Zumbi Moderador
4.1K Mensagens 1.2K Curtidas
#2 Por TerraSkilll
02/08/2017 - 13:03
João Victor Ribeiro Ferro disse:


Por que os compiladores não verificam se você está acessando um índice inválido. Isso é tanto uma otimização do compilador (verificar índices inválidos pode ser bem custoso) quanto uma característica da linguagem. Como C e C++ trabalham com ponteiros - mesmo para vetores/arrays - isso permite diversas técnicas que não são possíveis ou bem mais complicadas de outras formas. Lembre que, em C/C++, um vetor como esse nada mais é que um ponteiro, e que os índices são acessados por aritmética de ponteiros.

O seu exemplo é trivial, mas imagine algo como:


int vetor[99];

//preenche vetor aqui

int pos = funcaoQuePedeIndiceAoUsuario(); // pode ser 10, mas pode ser 1000

int valor = vetor[pos]; // pode ser uma posição válida, ou não


Durante a compilação, não há como saber se a variável pos indica um índice válido, somente em tempo de execução. E, em tempo de execução, para saber se é válida, seria necessário acessar a posição (multiplicando a variável pelo tamanho do tipo - int no caso). Vetores desse tipo não armazenam seu tamanho, apenas um bloco de memória, então não há um jeito fácil de saber se um índice é válido. Então, para saber se uma posição é válida, você precisa acessá-la.

João Victor Ribeiro Ferro disse:

Porque o compilador precisa saber que índice você quer que ele retorne. É o padrão da linguagem. Imagine o código:


int vetor[3];

vetor[0] = 11;
vetor[1] = 22;
vetor[2] = 33;

int numero = vetor[];


Qual deveria ser o valor da variável numero? Instintivamente, você pode dizer que seria 11, pois é a posição zero, mas para implementar isso num compilador seria necessário criar uma regra especial para esse caso, que oferece pouco ou nenhum benefício no final das contas.

Abraço.
Contribua para um fórum melhor: pense antes de postar.
"It isn't a contest. Just enjoy the ride." -> Seth Vidal
Hardware.com.br no Youtube!
esquiloesperto
esquiloesper... Cyber Highlander Moderador
7.1K Mensagens 2.2K Curtidas
#3 Por esquiloesper...
02/08/2017 - 13:43
Vetores (arrays) é um tipo primitivo de dados que o C++ herdou do antigo C e precisou manter para fins de compatibilidade. Desde o começo esse tipo de estrutura foi criado sem nenhum tipo de verificação dos limites (array outbounds). Um espaço em memória é reservado para a lista e enquanto ele não estiver completamente preenchido (memory outbound) você pode utilizar por sua conta e risco, ciente que resultados inesperados vão acontecer.

E o que motivou essa decisão é bem simples: Não se deve pagar pelo que não acontece. Isto significa economia dos recursos de processamento, já que o custo operacional da verificação a cada vez que uma célula for referenciada não irá existir.

É uma economia burra? - Sim, é claro... mas foi construído dessa maneira e assim permanece...

A melhor explicação que encontrei foi essa:
No C++ a verificação é possível com o uso de classes, mas uma array ainda é basicamente uma herança do C e não é uma classe. Além do mais, o C++ foi construído sob outra regra que torna inviável essa verificação. O princípio que rege o C++ é "you don't pay for what you don't use". Desde que o seu código esteja correto você não precisa de verificações e não se verá obrigado a pagar o custo de pré-processamentos como este em tempo de execução.
(Tradução nossa)

Só é difícil enquanto estiver oculto! cool.png
Use a pesquisa


rolleyes.png  Navegar é preciso, viver... também.  smile.png
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal