En realidad ambas formas "podrían" estar mal así como las tienes planteadas, te explico.
En la primera (que tiene un error):
Código:
void getAllData( std::vector<unsigned char>* char_array )
{
char_array->reserve(10);
(*char_array)[0] = 1; //Esto no funciona, da error al compilar
char_array->push_back( 1 ); //Esto funciona
unsigned char temp = char_array[0]; //Error de compilación.
}
Acuerdate que estás pasando un puntero y debes desreferenciar.
Lo que te digo que podría estar mal en ambos es el hecho de que no sabes que tamaño tiene el erreglo. Debes usar el método resize para cambiar el tamaño, reserve solo "reserva" la memoria, mas no "habilita" las posiciones.
En lo personal considero mejor la segunda opción.
Saludos