¿Qué es Array Decay en C++? ¿Cómo puede ser prevenido?

¿Qué es el decaimiento de array?  
La pérdida de tipo y dimensiones de una array se conoce como descomposición de una array. Esto generalmente ocurre cuando pasamos la array a la función por valor o puntero. Lo que hace es enviar la primera dirección a la array que es un puntero, por lo que el tamaño de la array no es el original, sino el que ocupa el puntero en la memoria.
 

CPP

// C++ code to demonstrate array decay
#include<iostream>
using namespace std;
  
// Driver function to show Array decay
// Passing array by value
void aDecay(int *p)
{
    // Printing size of pointer
    cout << "Modified size of array is by "
            " passing by value: ";
    cout << sizeof(p) << endl;
}
  
// Function to show that array decay happens 
// even if we use pointer
void pDecay(int (*p)[7])
{
    // Printing size of array
    cout << "Modified size of array by "
            "passing by pointer: ";
    cout << sizeof(p) << endl;
}
  
int main()
{
    int a[7] = {1, 2, 3, 4, 5, 6, 7,};
  
    // Printing original size of array
    cout << "Actual size of array is: ";
    cout << sizeof(a) <<endl;
  
    // Passing a pointer to array
    aDecay(a);
      
    // Calling function by pointer
    pDecay(&a);   
  
    return 0;
}

Producción:

Actual size of array is: 28
Modified size of array by passing by value: 8
Modified size of array by passing by pointer: 8

En el código anterior, la array real tiene 7 elementos int y, por lo tanto, tiene un tamaño de 28. Pero al llamar por valor y puntero, la array se convierte en puntero e imprime el tamaño de 1 puntero, es decir, 8 (4 en 32 bits).
¿Cómo prevenir el deterioro de la array?  
Una solución típica para manejar la descomposición es pasar el tamaño de la array también como un parámetro y no usar sizeof en los parámetros de la array (consulte esto para obtener más detalles).
Otra forma de evitar la descomposición de la array es enviar la array a funciones por referencia. Esto evita la conversión de la array en un puntero, por lo tanto, evita la descomposición.
 

CPP

// C++ code to demonstrate prevention of
// decay of array
#include<iostream>
using namespace std;
  
// A function that prevents Array decay
// by passing array by reference
void fun(int (&p)[7])
{
    // Printing size of array
    cout << "Modified size of array by "
            "passing by reference: ";
    cout << sizeof(p) << endl;
}
  
int main()
{
    int a[7] = {1, 2, 3, 4, 5, 6, 7,};
  
    // Printing original size of array
    cout << "Actual size of array is: ";
    cout << sizeof(a) <<endl;
  
    // Calling function by reference
    fun(a);
  
    return 0;
}

Producción:

Actual size of array is: 28
Modified size of array by passing by reference: 28

En el código anterior, pasar una array por referencia resuelve el problema de la descomposición de la array. Los tamaños en ambos casos son 28. 
Este artículo es una contribución de Manjeet Singh . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto 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 *