Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

ทำไม C++ ไม่รองรับฟังก์ชันที่คืนค่าอาร์เรย์

พิจารณาโปรแกรมต่อไปนี้:

#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

วิธีแก้:

  1. จัดสรรบน heap ด้วย new (ดูบทความ 1004082788)
  2. ใช้ std::vector หรือ std::array คืนค่าแบบ value (copy/move semantics)
  3. ใช้ std::unique_ptr<int[]> สำหรับ ownership transfer
  4. รับอาร์เรย์เป็นพารามิเตอร์ reference เพื่อเติมค่า (output parameter)

สรุป: C++ ไม่รองรับการคืนอาร์เรย์โดยตรง (return array) เพราะอาร์เรย์ไม่สามารถคัดลอกได้ (non-copyable) และคืน pointer ไปยัง local array เป็นอันตราย ต้องใช้วิธีอื่นแทน