d
โดยทั่วไปแล้วตัวแปรของคุณจะไม่แตกออกจากสแต็ก วงเล็บปีกกาไม่แสดงถึงกรอบสแต็ก มิฉะนั้นคุณจะไม่สามารถทำสิ่งนี้:
char var = getch();
{
char next_var = var + 1;
use_variable(next_char);
}
ถ้าวงเล็บปีกกาเป็นสาเหตุให้เกิดการเรียก / เรียกป๊อปอัพที่แท้จริง (เช่นการเรียกใช้ฟังก์ชัน) โค้ดด้านบนจะไม่คอมไพล์เพราะโค้ดที่อยู่ในเครื่องหมายปีกกาจะไม่สามารถเข้าถึงตัวแปรvar
ที่อยู่ภายนอกวงเล็บปีกกาได้ ฟังก์ชั่นไม่สามารถเข้าถึงตัวแปรโดยตรงในฟังก์ชั่นการโทร) เรารู้ว่านี่ไม่ใช่กรณี
เครื่องมือจัดฟันแบบหยิกใช้สำหรับกำหนดขอบเขต คอมไพเลอร์จะปฏิบัติต่อการเข้าถึงตัวแปร "inner" จากภายนอกวงเล็บปีกกาล้อมรอบไม่ถูกต้องและอาจใช้หน่วยความจำนั้นอีกครั้งเพื่อสิ่งอื่น อย่างไรก็ตามมันอาจไม่สามารถแตกออกจากสแต็กจนกว่าฟังก์ชั่นการปิดล้อมจะกลับมา
อัปเดต: นี่คือสิ่งที่C specบอกไว้ เกี่ยวกับวัตถุที่มีระยะเวลาการจัดเก็บอัตโนมัติ (ส่วน 6.4.2):
สำหรับวัตถุที่ไม่มีประเภทอาร์เรย์ความยาวแปรผันอายุการใช้งานจะขยายจากรายการไปยังบล็อกที่มีการเชื่อมโยงจนกว่าการประมวลผลของบล็อกนั้นจะสิ้นสุดลงอย่างไรก็ตาม
ส่วนเดียวกันกำหนดคำว่า "อายุการใช้งาน" เป็น (เน้นที่เหมือง):
อายุการใช้งานของวัตถุคือส่วนของการทำงานของโปรแกรมในระหว่างที่รับประกันการจัดเก็บที่จะสำรองไว้ วัตถุมีอยู่มีที่อยู่คงที่และเก็บค่าที่เก็บไว้ล่าสุดตลอดอายุการใช้งาน หากมีการอ้างถึงวัตถุนอกอายุการใช้งานของมันพฤติกรรมจะไม่ได้กำหนด
คำสำคัญที่นี่คือแน่นอน 'รับประกัน' เมื่อคุณออกจากขอบเขตของการจัดฟันด้านในแล้วอายุการใช้งานของอาเรย์จะสิ้นสุดลง ที่เก็บข้อมูลอาจหรืออาจยังไม่ได้รับการจัดสรรให้ (คอมไพเลอร์ของคุณอาจใช้พื้นที่สำหรับสิ่งอื่น) แต่ความพยายามใด ๆ ในการเข้าถึงอาเรย์ทำให้เกิดพฤติกรรมที่ไม่ได้กำหนดและทำให้เกิดผลลัพธ์ที่คาดเดาไม่ได้
สเป็ค C ไม่มีความคิดของเฟรมสแต็ก มันพูดถึงวิธีการที่โปรแกรมผลลัพธ์จะทำงานและออกจากรายละเอียดการใช้งานไปยังคอมไพเลอร์ (หลังจากนั้นการใช้งานจะดูแตกต่างกันมากใน CPU แบบไม่มีสแต็กกว่าบน CPU แบบสแต็กฮาร์ดแวร์) ไม่มีอะไรในสเป็ค C ที่สั่งว่าสแต็กเฟรมจะหรือไม่สิ้นสุด เพียงคนเดียวที่จริงวิธีที่จะรู้คือการรวบรวมรหัสบนโดยเฉพาะอย่างยิ่งคอมไพเลอร์ / แพลตฟอร์มของคุณและตรวจสอบที่เกิดการชุมนุม ชุดตัวเลือกการเพิ่มประสิทธิภาพปัจจุบันของคอมไพเลอร์ของคุณอาจมีบทบาทในเรื่องนี้เช่นกัน
ถ้าคุณต้องการให้แน่ใจว่าอาร์เรย์d
จะไม่กินหน่วยความจำอีกต่อไปในขณะที่รหัสของคุณกำลังทำงานอยู่คุณสามารถแปลงรหัสในวงเล็บปีกกาเป็นฟังก์ชันแยกต่างหากหรืออย่างชัดเจนmalloc
และfree
หน่วยความจำแทนการใช้ที่เก็บข้อมูลอัตโนมัติ