funcion que recibe array & sizeof()

Hola, tengo un par de problemas. Por mucho que le doy vueltas no lo entiendo, a ver si me podéis explicar...

El código:

void setup() 
{
Serial.begin(9600); 
}

void hacerFrase(char frase[])
{
    Serial.println(sizeof(frase));
    for(int i = 0; i <= sizeof(frase); i++)
    {
      Serial.println(frase[i]);
      delay(500);
    }
}

void loop() 
{
  char frase[] = "hipeople";
  hacerFrase(frase);
  Serial.println(sizeof(frase));
}

Vale, en este código hay dos cosas que se me escapan. La primera tiene que ver con la función. Le envío una matriz de 8 posiciones. Por que al escribir por consola, hace como que la matriz es de 3 posiciones? si después al salir de la función revisa la matriz y da 9??

Y la segunda es porque la función sizeof() siempre me devuelve el valor igual del tamaño del array + 1? osea, que sentido tiene esto? lo pregunto porque lo mismo me esta devolviendo el significado de otra cosa y no me doy cuenta... :S

este es el resultado en consola que me da, por si os da pereza comprobarlo, es:

2
h
i
p
9

y así en un bucle infinito, como es obvio.

Hola,
sizeof(frase) te da la longitud total de la variable (no de la frase), que en tu caso contiene la frase mas un '\0' carácter nulo final. Pero podría ser una variable de longitud 100 que tiene una frase de 8 caracteres.

Para obtener la longitud de la frase tienes que usar strlen(frase). Y para recorrer la frase la condición es "i < strlen(frase)"

void hacerFrase(char frase[])
{
    Serial.println(strlen(frase));
    for(int i = 0; i < strlen(frase); i++) 
    {
      Serial.print(frase[i]);
      delay(500);
    }
}

Dios, no me esperaba una respuesta tan rápida, gracias! ahora aprovecharé toda la mañana ^^

De acuerdo, es que miré en la referencia extendida de la web, y no encontré esa función, vi la de sizeof() que era la que creía que era la que necesitaba. Ya se me fueron las dudas, muchas gracias!