Error con sizeof dentro de una función

Buenas a todos,

Estoy intentando obtener el tamaño de un char en una función propia, pero no me funciona. Simplificando el problema en el siguiente código:

char mychar[]="abcde";

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

void loop(){
  Serial.print(sizeof(mychar)-1); delay(1000);
  myfunction(mychar);
}

void myfunction(char* example){
  int a=0;
  a=sizeof(example)-1;
  Serial.println(a);
}

En el monitor serie me aparece 51 en cada línea, 5 la primera vez que se envía el tamaño en el loop, y 1 cuando lo envía dentro de la función "myfunction". ¿Por qué pasa esto? ¿Cómo se utiliza sizeof() en una función propia? Muchas gracias!!

El error empieza en que mychar no esta definida.

Esto funcionó y compiló sin errores

char mychar[3];

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

void loop(){
  Serial.print(sizeof(mychar)-1); delay(1000);
  myfunction(mychar);
}

void myfunction(char* example){
  int a = 0;
  a = sizeof(example)-1;
  Serial.println(a);
}

surbyte:
El error empieza en que mychar no esta definida.

Pensé que con hacer:

char mychar[]="abcde";

era suficiente. Digo... ¿no se supone que el compilador puede deducir la longitud en esa declaración?

Respecto a la duda: espero que hayas aprendido el porqué no se debe confiar ciegamente en sizeof cuando un array se le pasa por parámetro; y con mucha más razón si se hace a manera de puntero. En esos casos, solo hay tres soluciones:

  • Asumir o suponer la longitud. Esta es la menos recomendada si el programador no tiene sufciiente experiencia en el manejo de memoria.
  • Pasarle por parámetro la longitud del array (usualmente en forma de int). Es el método más utilizado en operaciones como comparación, lectura y escritura en bloques; tiene la gran desventaja de que no hay forma segura de verificar el valor de este parámetro, es completamente arbitrario y puede ser distinto de la longitud real de array.
  • Si la porción de memoria está destinada a almacenar cadenas de caracteres, se puede confiar CASI plenamente en strlen. Casi porque esta función arroja valores incorrectos si el terminador de cadenas ('\0') está ausente o mal ubicado.

Claro yo creía que la línea:

char mychar[]="abcde";

definía el tamaño. Lo que me llama la atención es que sizeof() funciona sin problemas fuera de los void o en los de setup y loop, pero no en la función propia. Creo que tal como dices Lucario448 no se debe confiar ciegamente en sizeof(). Lo he probado con strlen y va sin problemas, gracias!!