Problema con sizeof()

Problema con sizeof()

de Nicolás Perez Quintero -
Número de respuestas: 5

Hola, estoy intentando hacer el ejercicio 1 y no logro usar la funcion sizeof para que me de el largo de un array. Más alla de si esta es la solucion para el ejercicio, no entiendo como se usa bien la función.

Estoy intentando usarla para que me de el tamaño de un array de fechas que se pasa como parámetro en la funcion pero da numeros que nada que ver.

Codigo

Si ejecuto ese codigo me da 0 pero si muevo todo para main() y  no uso la funcion ordenar(), me da bien.

En respuesta a Nicolás Perez Quintero

Re: Problema con sizeof()

de Pablo Andres Balliva Costa -

Creo que el problema en este caso es que en C/C++, cuando pasás un array a una función este array "decae" a un puntero al primer elemento de ese array, con lo que se pierde la información del tamaño. Por eso te funciona bien en main pero no dentro de una función. Como alternativa podés pasar un parámetro más a la función, que sea el tamaño del array.

Referencia: What is array-to-pointer conversion aka. decay?

Nota: En realidad sizeof no es una función, sino un operador (probá escribir sizeof fechas y vas a ver que también funciona). Aunque igual es buena idea usarlo con paréntesis.

En respuesta a Pablo Andres Balliva Costa

Re: Problema con sizeof()

de Nicolás Perez Quintero -
Entiendo, y si yo le paso el array a la funcion por referencia, osea, como un puntero al array, el decaimiento sigue pasando?
En respuesta a Nicolás Perez Quintero

Re: Problema con sizeof()

de Nicolas Guillermo Cortazzo Abelenda -
Lo correcto sería pasarle la longitud del array a la función ordenar como parámetro.

O usar std::array::size, no sé si tenemos permitido usar la standard library de C++ en este C*.

Sizeof te retorna el tamaño en bytes, ese calculo que haces es hasta peligroso, los arrays simplemente no guardan la información del largo.

Los compiladores de C++ cuando haces arrays de structs puede agregar bits de relleno por temas de optimización. Por más info: https://en.wikipedia.org/wiki/Data_structure_alignment
Si alguien tiene un recurso teórico más fidedigno que wikipedia al respecto que la compartan jeje
En respuesta a Nicolas Guillermo Cortazzo Abelenda

Re: Problema con sizeof()

de Pablo Andres Balliva Costa -

Estimo que la biblioteca estándar de C++ queda afuera de este curso.

Creo que no es cierto que los arrays no guardan información del largo. En cppreference hay un ejemplo en donde printf("sizeof(char[10]) = %zu\n", sizeof(char[10])); imprime 10. El tema es cuando los pasás como argumento a una función, donde este decae a un puntero y ahí si se pierde esa información.

Respecto a los bits de padding, sizeof se comporta así:

When applied to an operand that has structure or union type, the result is the total number of bytes in such an object, including internal and trailing padding. The trailing padding is such that if the object were an element of an array, the alignment requirement of the next element of this array would be satisfied, in other words, sizeof(T) returns the size of an element of a T[] array.