No use sizeof para parámetros de array en C

Usar sizeof directamente para encontrar el tamaño de las arrays puede generar un error en el código, ya que los parámetros de la array se tratan como punteros. Considere el siguiente programa.  

C

// C Program to demonstrate incorrect usage of sizeof() for
// arrays
#include <stdio.h>
 
void fun(int arr[])
{
    int i;
 
    // sizeof should not be used here to get number
    //  of elements in array
    int arr_size = sizeof(arr) / sizeof(arr[0]);
 
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
    // executed two times only
}
 
// Driver Code
int main()
{
    int i;
    int arr[4] = { 0, 0, 0, 0 };
    fun(arr);
 
    // use of sizeof is fine here
    for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
        printf(" %d ", arr[i]);
 
    getchar();
    return 0;
}

Explicación: este código genera un error ya que la función fun() recibe un parámetro de array ‘arr[]’ e intenta averiguar la cantidad de elementos en arr[] usando el operador sizeof.  
En C, los parámetros de array se tratan como punteros (ver esto para más detalles). Entonces, la expresión sizeof(arr)/sizeof(arr[0]) se convierte en sizeof(int *)/sizeof(int) lo que da como resultado 2 (el tamaño de int* es de 8 bytes porque es un puntero y el puntero ocupa los 8 bytes de memory e int es 4) y el bucle for dentro de fun() se ejecuta solo dos veces, independientemente del tamaño de la array. Por lo tanto, sizeof no debe usarse para obtener una cantidad de elementos en tales casos. 

Solución: 

1) Usar un parámetro separado: se debe pasar   un parámetro separado del tipo de datos size_t para el tamaño o la longitud de la array a fun(). size_t es un tipo de entero sin signo de al menos 16 bits. Entonces, el programa corregido será:

C

// C Program to demonstrate correct usage of sizeof() for
// arrays
#include <stdio.h>
 
void fun(int arr[], size_t arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
}
 
// Driver Code
int main()
{
    int i;
    int arr[] = { 0, 0, 0, 0 };
    size_t n = sizeof(arr) / sizeof(arr[0]);
    fun(arr, n);
 
    printf("The size of the array is: %ld", n);
    printf("\nThe elements are:\n");
    for (i = 0; i < n; i++)
        printf(" %d ", arr[i]);
 
    getchar();
    return 0;
}
Producción

The size of the array is: 4
The elements are:
 0  1  2  3 

2) Uso de macros: incluso podemos definir macros usando #define para encontrar el tamaño de las arrays, como se muestra a continuación,

C

// C Program to demonstrate usage of macros to find the size
// of arrays
#include <stdio.h>
 
#define SIZEOF(arr) sizeof(arr) / sizeof(*arr)
 
void fun(int arr[], size_t arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
}
 
// Driver Code
int main()
{
    int i;
    int arr[] = { 0, 0, 0, 0, 0 };
    size_t n = SIZEOF(arr);
    fun(arr, n);
 
    printf("The size of the array is: %ld", n);
    printf("\nThe elements are:\n");
    for (i = 0; i < n; i++)
        printf(" %d ", arr[i]);
 
    return 0;
}
Producción

The size of the array is: 5
The elements are:
 0  1  2  3  4 

3) Usar aritmética de punteros: Podemos usar (&arr)[1] – arr para encontrar el tamaño de la array. Aquí, arr apunta al primer elemento de la array y tiene el tipo int*. Y, &arr tiene el tipo como int*[n] y apunta a toda la array. Por lo tanto, su diferencia es equivalente al tamaño de la array.

C

// C Program to demonstrate usage of pointer arithmetic to
// find the size of arrays
#include <stdio.h>
 
void fun(int arr[], size_t arr_size)
{
    int i;
    for (i = 0; i < arr_size; i++) {
        arr[i] = i;
    }
}
 
// Driver Code
int main()
{
    int i;
    int arr[] = { 0, 0, 0, 0, 0 };
    size_t n = (&arr)[1] - arr;
    fun(arr, n);
 
    printf("The size of the array is: %ld", n);
    printf("\nThe elements are:\n");
    for (i = 0; i < n; i++)
        printf(" %d ", arr[i]);
 
    return 0;
}
Producción

The size of the array is: 5
The elements are:
 0  1  2  3  4 

Escriba comentarios si encuentra algo incorrecto en el artículo anterior o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *