Array Decay คือการที่อาร์เรย์สูญเสียข้อมูลประเภทและขนาด เมื่อส่งผ่านฟังก์ชัน อาร์เรย์จะ "สลาย" (Decay) กลายเป็น Pointer ไปยังองค์ประกอบแรก ทำให้ sizeof ให้ขนาดของ Pointer แทนขนาดอาร์เรย์เดิม
ตัวอย่าง Array Decay
#include <iostream>
using namespace std;
void DisplayValue(int* p) {
cout << "New size by passing value: " << sizeof(p) << endl; // 8 (pointer size)
}
void DisplayPointer(int (*p)[10]) {
cout << "New size by passing pointer: " << sizeof(p) << endl; // 8 (pointer size)
}
int main() {
int arr[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << "Actual size of array: " << sizeof(arr) << endl; // 40 (10 * 4 bytes)
DisplayValue(arr); // Decay to int*
DisplayPointer(&arr); // Pass pointer to array[10]
return 0;
}
ผลลัพธ์
Actual size of array: 40 New size by passing value: 8 New size by passing pointer: 8
วิธีป้องกัน Array Decay
1. ส่งขนาดอาร์เรย์เป็นพารามิเตอร์แยก
void func(int arr[], int size) { ... }
2. ส่งโดย Reference (แนะนำ)
void Display(int (&p)[10]) {
cout << "Size by reference: " << sizeof(p) << endl; // 40 ✓
}
int main() {
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
Display(arr); // ไม่ decay
}
3. ใช้ std::array (C++11) - แนะนำมากที่สุด
#include <array> void func(array& arr) { cout << arr.size(); // 10 ✓ }
4. ใช้ std::vector
void func(const vector& vec) { cout << vec.size(); }
สรุป
ควรใช้ std::array หรือ std::vector แทน C-style array เพื่อหลีกเลี่ยง Array Decay และได้ฟีเจอร์เพิ่มเติม