[C con Clase] limites de vectores.

Steven Davidson srd4121 en njit.edu
Lun Jun 21 21:25:25 CEST 2010


Hola Jorge,

Jorge Vega Sanchez wrote:
> Buenas, esta tarde haciendo unas pruebas para una cosa que teng que
> implementar me he llevado una sorpresa bastante grande.
> Estaba definiendo vectores, de la forma "normal" y luego con new y
> cual ha sido mi sorpresa de que puedo visualizar y asignar valores
> fuera del rango del vector.
> 
> Es decir si defino un vector/array de tamaño 10, puedo imprimir por
> pantalla en valor de la posición 12. Pensaba que daría error o que
> saldría un valor extraño pero no.
> 

Por esta razón, siempre decimos que hay que tener mucho cuidado que los 
índices no salgan fuera de los límites del array. Los índices también 
pueden ser negativos. Por ejemplo,

int lista[10];

lista[-5] = 4;

Obviamente, esto es un error de programación, porque nos hemos salido 
del intervalo de valores válidos para un índice. Sin embargo, no es un 
error gramatical, y por ello el lenguaje te permite hacer este tipo de 
cosas.

> Me gustaría saber si hay alguna forma de que de error sin tener que
> controlar nosotros que estamos dentro de rango. Es decir si me he

No estoy seguro a qué te refieres con estea petición. Si quieres forzar 
un error al usar índices, entonces NO controles el intervalo. Por ejemplo,

int lista[10];

lista[10000] = 5;

Seguramente te dará un error.

> dejado algo. Por cierto he leido información sobre la variables
> size_t que se supone que se usan para controlar tamaños de vectores y
> cosas similares. Pero en casos como el que pongo no tengo ni idea de
> como incluirlo.
> 

'size_t' no es un tipo básico o primitivo. Incluye el fichero de 
cabecera <cstddef> para su definición.

> #include <iostream>
> 
> using namespace std;
> 
> int main ()
> {
> 	// Vector definido a la manera tradicional
> 	int array[10];
> 	
> 	cout << " Prueba de vector " << endl;
> 	array[4]=567;
> 	for (int c=0; c<15; c++) 
> 	{
> 		cout << array[c] << endl;
> 	}
> 	// ============
> 	cout << "SEPARACION" << endl << endl;
> 	// Vector definido con NEW
> 	int *vector;
> 	vector= new int[10];
> 	
> 	vector[4]=69;
> 	
> 	for (int j=0; j<15; j++) 
> 	{
> 		cout << vector[j] << endl;
> 	}
> 	
> 	delete(vector);

Técnicamente, esto no es correcto. Usar el operador 'delete[]'. Esto es,

delete[] vector;

> 	
> 	return 0;
> 	
> }
> 

Personalmente, mi sistema operativo no me dio un error por las lecturas 
fuera del intervalo de índices para los arrays. Sin embargo, si me dio 
un error de escritura cuando puse un índice grande. Por ejemplo,

array[400] = 567;  // Error de Escritura
...
vector[4000] = 567;  // Error de Escritura


Espero que esto aclare las dudas.

Steven





Más información sobre la lista de distribución Cconclase