Что такое распад массива в C ++? Как это предотвратить?
Что такое распад массива?
Потеря типа и размеров массива называется распадом массива. Обычно это происходит, когда мы передаем массив в функцию по значению или указателю. Что он делает, так это то, что он отправляет первый адрес в массив, который является указателем, поэтому размер массива не является исходным, а размером, занимаемым указателем в памяти.
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, и помогите другим гикам.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по теме, обсужденной выше.