Extracto de TopCoder artículo:

La expresión sizeof(data)/sizeof(data[0]) devuelve el tamaño de la matriz data, pero solo en algunos casos , así que no lo use en ningún lugar excepto en tales construcciones. (Los programadores de C estarán de acuerdo ¡conmigo!)

Para obtener el tamaño de la matriz, he estado usando esta expresión sizeof(data)/sizeof(data[0]) todo el tiempo para todos los tipos primitivos .

¿Alguien sabe sobre algún caso en el que la expresión anterior no se debe utilizar?

1
Saurav Sahu 29 dic. 2016 a las 22:13

3 respuestas

La mejor respuesta

Si data se declarara así:

int *data;

Y luego espacio para ello asignado así:

data = malloc( NUM_ELEMENTS * sizeof(int) );

Entonces su técnica no funcionará, porque sizeof(data) tiene el tamaño de un puntero , no el contenido de la matriz.

4
Scott Hunter 29 dic. 2016 a las 19:16

El tamaño de la técnica de corrección de trabajo para la matriz estática, no tendrá ningún problema. Como se mencionó anteriormente para los datos de matriz dinámica y puntero, no funcionará correctamente.

0
Jitendra 30 dic. 2016 a las 11:06

El enfoque sizeof compila pero no funciona cuando le da un puntero o una matriz de tamaño indeterminado. Simplemente use el enfoque apropiado de C ++:

template <typename T, std::size_t N>
constexpr std::size_t size(T(&)[N]) {
    return N;
}

Usar size() en una matriz funciona correctamente. Será un error en tiempo de compilación usarlo en un caso donde no es aplicable, por ejemplo, en un puntero.

4
Dietmar Kühl 29 dic. 2016 a las 19:19