คุณไม่สามารถเข้าถึงตัวแปรในเครื่องได้เมื่ออยู่นอกขอบเขต นี่คือสิ่งที่หมายถึงตัวแปรท้องถิ่น ถึงแม้ว่า ให้เราดูตัวอย่างที่คุณอาจสามารถเข้าถึงหน่วยความจำของตัวแปรภายในเครื่องนอกขอบเขต
ตัวอย่าง
#include<iostream> int* foo() { int x = 3; return &x; } int main() { int* address = foo(); cout << *address; *address = 12; cout << *address; }
ผลลัพธ์
สิ่งนี้อาจให้ผลลัพธ์ -
3 12
ดังที่ฉันได้กล่าวไว้ก่อนหน้านี้รหัสนี้อาจใช้งานได้ เราแค่อ่านและเขียนในหน่วยความจำที่ใช้เป็นที่อยู่ของ x โดยหลักแล้ว คุณอยู่นอกขอบเขตของ foo ที่อยู่จะเป็นตัวชี้ไปยังพื้นที่หน่วยความจำแบบสุ่ม ในตัวอย่างข้างต้น พื้นที่หน่วยความจำนั้นมีอยู่จริงและไม่มีอะไรอื่นกำลังใช้งานอยู่ในขณะนี้ คุณจะไม่ทำลายสิ่งใด ๆ ด้วยการใช้งานต่อไป (คุณจะไม่ใช้พื้นที่หน่วยความจำของกระบวนการอื่นหรือพื้นที่หน่วยความจำที่ไม่ได้รับอนุญาตอื่น ๆ ) และยังไม่มีสิ่งใดเขียนทับมัน ดังนั้น 3 ตัวจึงยังคงอยู่
ในโปรแกรมจริง หน่วยความจำนั้นอาจถูกนำกลับมาใช้ใหม่เกือบจะในทันที และคุณอาจทำบางอย่างเสียหายได้ เช่น การทำเช่นนี้ ข้อบกพร่องในการเข้าถึงหน่วยความจำดังกล่าวนั้นยากต่อการติดตามและกำจัด
เมื่อคุณกลับมาจาก foo โปรแกรมจะบอก OS ว่าหน่วยความจำของ x ไม่ได้ถูกใช้อีกต่อไปแล้ว และสามารถกำหนดใหม่ให้กับอย่างอื่นได้ หากคุณโชคดีและได้รับการมอบหมายใหม่ และระบบปฏิบัติการไม่ตรวจจับว่าคุณใช้มันอีก คุณก็สามารถใช้งานได้