สิ่งสำคัญคือต้องมีคำจำกัดความที่ชัดเจนว่าคำศัพท์หมายถึงอะไร น่าเสียดายที่ดูเหมือนจะมีคำจำกัดความหลายคำว่าอาร์เรย์แบบคงที่และไดนามิกหมายถึงอะไร
ตัวแปรคงเป็นตัวแปรกำหนดโดยใช้การจัดสรรหน่วยความจำแบบคงที่ นี่เป็นแนวคิดทั่วไปที่ไม่ขึ้นกับ C / C ++ ใน C / C ++ เราสามารถสร้างตัวแปรแบบคงที่ด้วย global, file หรือ local scope ได้ดังนี้:
int x[10];
static int y[10];
foo() {
static int z[10];
ตัวแปรอัตโนมัติมักจะดำเนินการโดยใช้การจัดสรรหน่วยความจำสแต็คตาม สามารถสร้างอาร์เรย์อัตโนมัติใน C / C ++ ดังนี้:
foo() {
int w[10];
สิ่งที่อาร์เรย์เหล่านี้x, y, z
และw
มีเหมือนกันคือขนาดของแต่ละอาร์เรย์ได้รับการแก้ไขและกำหนดไว้ในเวลาคอมไพล์
เหตุผลประการหนึ่งที่สำคัญในการทำความเข้าใจความแตกต่างระหว่างอาร์เรย์อัตโนมัติและอาร์เรย์แบบคงที่ก็คือการจัดเก็บแบบคงที่มักจะถูกนำไปใช้ในส่วนข้อมูล (หรือส่วน BSS ) ของไฟล์อ็อบเจ็กต์และคอมไพเลอร์สามารถใช้ที่อยู่สัมบูรณ์เพื่อเข้าถึงอาร์เรย์ซึ่งเป็นไปไม่ได้ด้วยการจัดเก็บแบบสแต็ก
โดยทั่วไปแล้วสิ่งที่หมายถึงอาร์เรย์แบบไดนามิกไม่ใช่สิ่งที่ปรับขนาดได้ แต่มีการใช้งานโดยใช้การจัดสรรหน่วยความจำแบบไดนามิกที่มีขนาดคงที่ซึ่งกำหนดในขณะทำงาน ใน C ++ นี้จะกระทำโดยใช้ผู้ประกอบการnew
foo() {
int *d = new int[n];
แต่เป็นไปได้ที่จะสร้างอาร์เรย์อัตโนมัติที่มีขนาดการแก้ไขที่กำหนดไว้ที่รันไทม์โดยใช้alloca
:
foo() {
int *s = (int*)alloca(n*sizeof(int))
สำหรับอาร์เรย์ไดนามิกที่แท้จริงควรใช้บางอย่างเช่นstd::vector
ใน C ++ (หรืออาร์เรย์ความยาวตัวแปรใน C )
การมอบหมายงานในคำถามของ OP มีความหมายอย่างไร ฉันคิดว่ามันเป็นที่ชัดเจนว่าสิ่งที่ต้องการก็ไม่ได้เป็นแบบคงที่หรืออาร์เรย์อัตโนมัติ แต่อย่างหนึ่งที่ทั้งจัดสรรหน่วยความจำแบบไดนามิกที่ใช้ใช้ประกอบการหรือไม่คงอาร์เรย์ขนาดใช้เช่นnew
std::vector