es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Declaración de puntero typedef en descomposición de parámetros de función en una matriz.

Tengo una typedef simple del arreglo:

typedef char myString[8];

Y una función que toma un myString y otra que toma un myString*. Curiosamente, ambas de estas funciones tienen la misma implementación y producen la misma salida:

void foo(myString s){
    std::string stdstr(reinterpret_cast<char*>(s), 8);
    std::cout << stdstr << std::endl;
}

void bar(myString* s){
    std::string stdstr(reinterpret_cast<char*>(s), 8);
    std::cout << stdstr << std::endl;
}

foo tiene sentido para mí, pero no entiendo qué está sucediendo en bar. ¿Por qué es válido hacer un casting de myString* a char*? ¿No es el tipo subyacente char**? Supongo que hay algún azúcar sintáctica en juego, pero no puedo encontrar ninguna referencia a este caso en particular.

Ten en cuenta que cambiar las funciones a void foo(char* s) y void bar(char** s) produce salidas diferentes, como se esperaba.

Ejemplo funcional disponible aquí.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    La razón por la que es válido hacer un casting de myString* a char* en bar es porque myString está definido como un array de char, con un tamaño fijo de 8. Cuando se pasa un array como argumento a una función, el nombre del array se convierte automáticamente en un puntero a su primer elemento.

    Por lo tanto, en bar, s es en realidad un puntero al primer elemento del array (es decir, char*), no un puntero a un puntero (es decir, char**). Por lo tanto, reinterpret_cast<char*>(s) hace un casting de s a char*, que se puede utilizar para inicializar stdstr.

    En cambio, void bar(char** s) espera un puntero a un puntero, por lo que reinterpret_cast<char**>(s) resulta en un char**, que es un tipo incorrecto para la inicialización de stdstr.

    En general, typedef char myString[8] crea un array de char de tamaño fijo, que se convierte implícitamente en un puntero a su primer elemento cuando se pasa como argumento a una función. Esto permite que bar acepte myString* como argumento y lo trate como un char*.</char**></char*>

Comments are closed.