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

หน่วยความจำของตัวแปรโลคัลสามารถเข้าถึงได้นอกขอบเขตใน C/C++ หรือไม่


ให้เราดูตัวอย่างที่คุณอาจสามารถเข้าถึงหน่วยความจำของตัวแปรในเครื่องนอกขอบเขตได้

ตัวอย่าง

#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 ไม่ได้ถูกใช้อีกต่อไป และสามารถกำหนดใหม่ให้กับอย่างอื่นได้ หากคุณโชคดีและได้รับการมอบหมายใหม่ และระบบปฏิบัติการไม่ตรวจจับว่าคุณใช้มันอีก คุณก็สามารถใช้งานได้