Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Truy cập biến cục bộ từ hàm khác dùng con trỏ C++


Không thể truy cập biến cục bộ sau khi nó hết phạm vi (scope). Đó là ý nghĩa của biến cục bộ. Tuy nhiên, xem ví dụ có THỂ truy cập bộ nhớ của biến cục bộ bên ngoài phạm vi.

Ví dụ

#include <iostream>
using namespace std;

int* foo() {
    int x = 3;
    return &x; // Trả về địa chỉ biến cục bộ - NGUY HIỂM
}

int main() {
    int* address = foo();
    cout << *address; // 3 (có thể)
    *address = 12;
    cout << *address; // 12 (có thể)
}

Đầu ra (có thể)

3 12

Mã này CÓ THỂ chạy. Chúng ta đọc/ghi vùng nhớ CŨNG là địa chỉ của x. Trong main, đã ngoài phạm vi foo, con trỏ trỏ đến vùng nhớ ngẫu nhiên. Ví dụ này vùng nhớ còn tồn tại và chưa bị ghi đè. Vì vậy giá trị 3 còn đó.

Trong chương trình thực, vùng nhớ đó có thể được tái dùng gần như ngay lập tức và bạn sẽ phá hỏng thứ gì đó. Bug truy cập bộ nhớ kiểu này rất khó truy tìm.

Khi trả về từ foo, chương trình báo cho OS vùng nhớ của x không còn dùng và có thể gán cho việc khác. Nếu may mắn nó chưa được gán lại và OS không bắt bạn dùng lại, bạn có thể "lucky" qua mặt.