Array [n] vs Array [10] - การเริ่มต้นอาร์เรย์ด้วยตัวแปรเทียบกับจำนวนจริง


91

ฉันมีปัญหาต่อไปนี้กับรหัสของฉัน:

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

ส่งกลับข้อผิดพลาดต่อไปนี้:

error: variable-sized object 'tenorData' may not be initialized

ในขณะที่ใช้double tenorData[10]งาน

ใครทราบสาเหตุ?


4
มันจะช่วยให้ภาษา ใน C ++ อาร์เรย์ของแบบฟอร์มนั้นจำเป็นต้องมีขนาดคงที่ของเวลาคอมไพล์
OrangeAlmondSoap

C ++ โดยใช้ Codeblocks กับคอมไพเลอร์ mingw32-g ++!
msmf14

ขอบคุณจัสตินและ @AndrewVarnerin ที่แก้ไขได้! เพิ่ม const ก่อน int: const int n = 10; แก้ไขแล้ว!
msmf14

คำตอบ:


196

ใน C ++ อาร์เรย์ความยาวตัวแปรไม่ถูกต้องตามกฎหมาย G ++ อนุญาตให้เป็น "ส่วนขยาย" (เนื่องจาก C อนุญาต) ดังนั้นใน G ++ (โดยไม่ต้อง-pedanticปฏิบัติตามมาตรฐาน C ++) คุณสามารถทำได้:

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

หากคุณต้องการ "อาร์เรย์ความยาวตัวแปร" (ดีกว่าเรียกว่า "อาร์เรย์ขนาดไดนามิก" ใน C ++ เนื่องจากไม่อนุญาตให้ใช้อาร์เรย์ความยาวตัวแปรที่เหมาะสม) คุณจะต้องจัดสรรหน่วยความจำแบบไดนามิกด้วยตัวเอง:

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

หรือยังดีกว่าให้ใช้ภาชนะมาตรฐาน:

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

หากคุณยังต้องการอาร์เรย์ที่เหมาะสมคุณสามารถใช้ค่าคงที่ไม่ใช่ตัวแปรเมื่อสร้างได้:

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

ในทำนองเดียวกันหากคุณต้องการรับขนาดจากฟังก์ชันใน C ++ 11 คุณสามารถใช้ a constexpr:

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
ขอบคุณนี่เป็นอีกหนึ่งทางออกที่ดี สิ่งที่ฉันต้องการจริงๆในตอนท้ายคือเวกเตอร์แทนที่จะเป็นอาร์เรย์!
msmf14

1
@ msmf14: ใช่คอนเทนเนอร์มาตรฐานเหมือนvectorมีประโยชน์อย่างเหลือเชื่อ
Cornstalks

โซลูชันเวกเตอร์เริ่มต้นแต่ละองค์ประกอบเมื่อคุณเรียก "std :: vector <[some class]> a (n);" หรือไม่
Justin

3
หากคุณไม่ได้จัดสรรมากนัก (หากมีขนาดเล็กเมื่อเทียบกับขนาดสแต็ก) ฉันต้องการใช้หน่วยความจำสแต็กกับการจัดสรร (3) และการจัดวางใหม่ ด้วยวิธีนี้คุณไม่จำเป็นต้องกังวลเกี่ยวกับการปล่อยหน่วยความจำให้ว่างและการจัดสรรหน่วยความจำนั้นเร็วกว่ามาก
holgac

2
+1 สำหรับการกล่าวถึงว่า g ++ อนุญาต เนื่องจากฉันไม่ได้สังเกตข้อผิดพลาดนี้และสิ่งนี้อธิบายถึงความแตกต่าง
gebbissimo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.