พิจารณาโปรแกรมต่อไปนี้:
#include <iostream>
using namespace std;
int* Array() {
int a[100]; // อาร์เรย์ท้องถิ่น (บน stack)
a[0] = 7;
a[1] = 6;
a[2] = 4;
a[3] = 3;
return a; // คืนที่อยู่ของอาร์เรย์ท้องถิ่น
}
int main() {
int* p = Array();
cout << p[0] << " " << p[1] << " " << p[2] << " " << p[3];
return 0;
}
โปรแกรมนี้จะให้คำเตือน (warning):
คำเตือน
In function 'int* Array()':
warning: address of local variable 'a' returned [-Wreturn-local-addr]
int a[100];
เหตุผล: เราคืนที่อยู่ของตัวแปรท้องถิ่น (local variable) ซึ่งจัดสรรบน stack หน่วยความจำนี้จะไม่มีอยู่แล้วหลังจบการเรียกฟังก์ชัน (out of scope) การเข้าถึงมันเป็น undefined behavior
วิธีแก้:
- จัดสรรบน heap ด้วย
new(ดูบทความ 1004082788) - ใช้
std::vectorหรือstd::arrayคืนค่าแบบ value (copy/move semantics) - ใช้
std::unique_ptr<int[]>สำหรับ ownership transfer - รับอาร์เรย์เป็นพารามิเตอร์ reference เพื่อเติมค่า (output parameter)
สรุป: C++ ไม่รองรับการคืนอาร์เรย์โดยตรง (return array) เพราะอาร์เรย์ไม่สามารถคัดลอกได้ (non-copyable) และคืน pointer ไปยัง local array เป็นอันตราย ต้องใช้วิธีอื่นแทน