Imagínate un arreglo de enteros... aunque no asignes ningún valor, el arreglo va a tener enteros en todas sus posiciones.... es lo que se conoce como basura. ¿Cómo determinas si el valor de un arreglo es válido o no? No puedes.
 
Aún inicializando el arreglo (el valor que se suele poner por defecto es 0). Si te encuentras un 0 en un momento dado, ¿podrías determinar si ese valor es válido o no? pues básicamente depende de si el 0 forma parte del rango válido de valores o no. En el caso más genérico, cualquier valor que te encuentres en el arreglo será válido. 
¿Cual es la solución entonces? 
Una de ellas es agrupar los valores válidos al inicio del arreglo y disponer de una variable entera que indique el número de posiciones del arreglo que tienen un valor válido:    
Código C++:
Ver original- struct Lista 
- { 
-   int* arreglo; 
-   int numElementos; 
-   int maxElementos; 
- }; 
La tercera variable sirve para saber cuando el arreglo está lleno y no pasarse. 
PD.: es responsabilidad del programador asignar los valores correctos a estas variables en todo momento, no hay ningún mecanismo en C que los vaya a rellenar por ti. 
Un saludo.