Computer >> Máy Tính >  >> Lập trình >> C ++

Array Decay trong C ++ là gì? nó có thể được phòng ngừa như thế nào?

Sau đây chúng ta sẽ xem Array Decay là gì. Việc mất kiểu và kích thước của một mảng được gọi là phân rã mảng. Nó xảy ra khi chúng ta truyền mảng vào một hàm bằng con trỏ hoặc giá trị. Địa chỉ đầu tiên được gửi đến mảng là một con trỏ. Đó là lý do tại sao, kích thước của mảng không phải là kích thước ban đầu.

Hãy để chúng tôi xem một ví dụ về phân rã mảng bằng cách sử dụng mã C ++,

Ví dụ

#include<iostream>
using namespace std;
void DisplayValue(int *p) {
   cout << "New size of array by passing the value : ";
   cout << sizeof(p) << endl;
}
void DisplayPointer(int (*p)[10]) {
   cout << "New size of array by passing the pointer : ";
   cout << sizeof(p) << endl;
}
int main() {
   int arr[10] = {1, 2, };
   cout << "Actual size of array is : ";
   cout << sizeof(arr) <<endl;
   DisplayValue(arr);
   DisplayPointer(&arr);
}

Đầu ra

Actual size of array is : 40
New size of array by passing the value : 8
New size of array by passing the pointer : 8

Bây giờ, chúng ta sẽ xem cách ngăn phân rã mảng trong C ++. Có hai cách sau để ngăn mảng phân rã.

  • Việc phân rã mảng được ngăn chặn bằng cách chuyển kích thước của mảng dưới dạng tham số và không sử dụng sizeof () trên các tham số của mảng.
  • Truyền mảng vào hàm bằng tham chiếu. Nó ngăn chặn việc chuyển đổi mảng thành con trỏ và ngăn phân rã mảng.

Ví dụ

#include<iostream>
using namespace std;
void Display(int (&p)[10]) {
   cout << "New size of array by passing reference: ";
   cout << sizeof(p) << endl;
}
int main() {
   int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
   cout << "Actual size of array is: ";
   cout << sizeof(arr) <<endl;
   Display(arr);
}

Đầu ra

Actual size of array is: 40
New size of array by passing reference: 40