01/10/2018, 16:25

Về con trỏ và ô nhớ trên stack

Chào anh chị và các bác! Em có đoạn code bên dưới, không hiểu sao khi chạy trên visual studio dòng //print 2 và print 3 lại khác nhau ở giá trị *p, print 4 và print 5 cũng vậy. còn khi chạy trên ide online thì *p ở các dòng này đều bằng 0. Mong anh chị và các bác giải thích giúp em. Em xin cảm ơn!

#include<iostream>
using namespace std;
void f(int *x) {  
    int a = 4;  
    x = &a; 
} 
 
void g(int *&x) { 
    int a = 3;  
    x = &a; 
} 

void h(const int *&x) {  
    int b = 2;  
    x = &b;
} 
 
int main() { 
     int *p = new int; 
    *p = 5;  f(p); 
     cout << p << " " << *p << endl; // Print #1 
    g(p); 
    cout << p << " " << *p << endl; // Print #2 
    cout << p << " " << *p << endl; // Print #3 
    const int*p1 = p;  
    h(p1);  
    cout << p << " " << *p << endl; // Print #4 
    cout << p << " " << *p << endl; // Print #5 
    cin >> *p; 
} 
NBQ viết 18:32 ngày 01/10/2018

Trong các hàm của bạn thì bạn đều gán con trỏ int *x tới địa chỉ của các biến int a/ int b - là những biến cục bộ được lưu trên Stack, khi ra khỏi hàm các biến này bị xóa cho nên vùng nhớ mà con trỏ int *x trỏ tới sẽ là một địa chỉ bất kỳ. Đối với hàm:

void f(int *x) {  
    int a = 4;  
    x = &a; 
} 

thì ra khỏi hàm này giá trị của x không bị thay đổi nên *p = 5.

void g(int *&x) { 
    int a = 3;  
    x = &a; 
} 

void h(const int *&x) {  
    int b = 2;  
    x = &b;
} 

Trong hai hàm này bạn thay đổi giá trị của x trỏ tới một địa chỉ trên vùng nhớ Stack nên sau khi ra khỏi hàm nó sẽ tới một địa chỉ linh tinh dẫn đến mỗi lần chạy bạn sẽ thấy p và *p cho ra một giá trị khác.

Phạm Vân viết 18:27 ngày 01/10/2018

Em có thử thấy thì khi mình gọi h hoặc g, lần in đầu tiên của *p sẽ cho giá trị là a hoặc b tùy hàm gọi, nhưng in thêm một lần hay nhiều lần tiếp theo thì đều cho cùng một giá trị rác, chẳng hạn như trên //Print #3 và //Print #5 cho giá trị *p là cùng một giá trị rác. Nên em nghĩ nó phải trỏ cùng vào một vùng nhớ nào đó. Em cảm ơn!

Bài liên quan
0