Что такое распад массива в C ++? Как это предотвратить?

Опубликовано: 1 Января, 2022

Что такое распад массива?
Потеря типа и размеров массива называется распадом массива. Обычно это происходит, когда мы передаем массив в функцию по значению или указателю. Что он делает, так это то, что он отправляет первый адрес в массив, который является указателем, поэтому размер массива не является исходным, а размером, занимаемым указателем в памяти.

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 as an array is always passed by reference
aDecay(a);
// Calling function by pointer
pDecay(&a);
return 0;
}

Выход:

 Фактический размер массива: 28
Изменен размер массива путем передачи по значению: 8
Изменен размер массива путем передачи по указателю: 8

В приведенном выше коде фактический массив состоит из 7 элементов int и, следовательно, имеет размер 28. Но при вызове по значению и указателю массив распадается на указатель и печатает размер 1 указателя, т.е. 8 (4 в 32-битном).
Как предотвратить распад массива?
Типичное решение для обработки распада - передать размер массива также в качестве параметра и не использовать sizeof для параметров массива (подробности см. Здесь)
Другой способ предотвратить распад массива - отправить массив в функции по ссылке. Это предотвращает преобразование массива в указатель, следовательно, предотвращает распад.

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;
}

Выход:

 Фактический размер массива: 28
Изменен размер массива путем передачи по ссылке: 28

В приведенном выше коде передача массива по ссылке решает проблему распада массива. Размеров в обоих случаях 28.
Автором этой статьи является Манджит Сингх. Если вам нравится GeeksforGeeks и вы хотите внести свой вклад, вы также можете написать статью, используя write.geeksforgeeks.org, или отправить ее по электронной почте на deposit@geeksforgeeks.org. Посмотрите, как ваша статья появляется на главной странице GeeksforGeeks, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.

Хотите узнать о лучших видео и практических задачах, ознакомьтесь с базовым курсом C ++ для базового и продвинутого уровня C ++ и курсом C ++ STL для базового уровня плюс STL. Чтобы завершить подготовку от изучения языка к DS Algo и многому другому, см. Полный курс подготовки к собеседованию .



C++ C