Thắc mắc về cách con trỏ quản lý vùng nhớ

Chào mọi người, hôm nay mình làm bài tập thì phát hiện ra mình có thể chưa hiểu con trỏ như mình nghĩ @@ . Mọi người giải đáp giúp mình vấn đề dưới với ạ

Mọi người có thể nhìn hàm swapData ở dưới đây. Mình có tạo một bản sao Node mang giá trị X trước khi hoán vị là ele_X_copy. Theo như kiến thức mình biết thì ele_X và ele_X_copy sẽ quản lý chung một vùng nhớ data B như hình.

image

Theo mình hiểu thì khi thay đổi giá trị trong data B qua ele_X thì ele_X_copy cũng sẽ cập nhật theo luôn phải không ạ? Thế nhưng khi ở trong hàm swapData mình thay đổi giá trị của ele_X bằng y nhưng giá trị của ele_X_copy lại không được cập nhật. Không biết việc này có phải là lỗi không hay mình đã hiểu sai bản chất con trỏ vậy ạ?

Hàm swapData là để hoán vị giá trị của 2 node mang giá trị x và y trong List và return node mang giá trị x trước khi hoán vị

Node *swapData(List &L, int const& x, int const& y)
{ 
    if (L.pHead)
    {
        Node *ele_X = findNode(L, x);  // tim phan tu co gia tri x trong list
        Node *ele_Y = findNode(L, y);  // tim phan tu co gia tri y trong list
        if (ele_X && ele_Y)
        {
            Node *ele_X_copy = ele_X;
            ele_X->info = y;
            ele_Y->info = x;

            return ele_X_copy;
        }
    }
    return NULL;
}

Mong được giải ngố :sweat_smile: cảm ơn mọi người ạ!

ele_X_copy được khai báo trong stack và là local variable của hàm swapData. Địa chỉ của con trỏ này không đổi, nhưng do nằm ở stack nên sẽ được sử dụng cho hàm khác. Do đó giá trị này có thể là bất kì giá trị nào (rác). Hành vi return địa chỉ của biến cục bộ được xem là undefined behavior.

3 Likes

Hic, cảm ơn anh vì đã giải đáp, nhưng em vẫn chưa hiểu lắm :frowning:

Em không hiểu tại sao hành vi này lại bị xem là undefined behavior. Em nghĩ là khi mình tạo ra ele_X_copy thì

  1. Em đã trao quyền cho nó cùng quản lý vùng Data B với ele_X thì tức là nó đã được explicitly defined.
  2. Và khi ra khỏi hàm swapData thì có dù ele_X_copy có bị thu hồi nhưng địa chỉ nó trả về đáng lẽ là vùng Data B đã được cập nhật chứ sao lại là rác ạ?

Bạn chưa hiểu việc thu hồi để làm gì à?

1 Like

Nghe bạn nói mình không biết mình có hiểu sai việc thu hồi không nữa :thinking:

Mình hiểu việc thu hồi như vầy, khi ra khỏi swapData thì hệ điều hành sẽ thu hồi biến con trỏ ele_X_copy nhưng vùng nhớ mà ele_X_copy trỏ đến trước đó vẫn còn tồn tại vì mình chưa giải phóng vùng nhớ đó.
Mình mô tả lại quá trình đó như hình:

Không biết là mình có đang hiểu sai không nhỉ? :sweat_smile:

1 Like

hiểu đúng rồi :V

mà swap như kiểu kia là swap giá trị của 2 node với nhau, ko phải swap 2 node với nhau nha :V

3 Likes

Đúng rồi bạn ơi, mình đang swap giá trị 2 node với nhau thôi chứ chưa swap 2 node á :rofl:

Cái mình thắc mắc là tại sao ele_X_copy và ele_X cùng quản lý một vùng nhớ nhưng khi mình cập nhật giá trị info cho ele_X thì ele_X_copy lại không cập nhật theo í :frowning: :sob:

sao lại ko cập nhật theo :V

            Node *ele_X_copy = ele_X;
            ele_X->info = y;
            cout << ele_X_copy->info; // in ra coi có cập nhật theo ko
            ele_Y->info = x;
3 Likes

Cảm ơn bạn, đúng thật là test riêng thì ele_X_copy có cập nhật theo :thinking:
Chắc vấn đề nằm ở một function khác của mình rồi :sob:
Không hiểu sao khi mình in cái ele_X_copy->info ở hàm main nó lại ra x chứ không phải y :sweat_smile:

Cảm ơn mn đã giúp đỡ nhiều ạ :two_hearts:

reply lâu quá vậy :V

trường hợp nó ko cập nhật thì có thể là nó ko tìm thấy cả x và y nên nó mới ko cập nhật :V check giá trị con trỏ trả về có phải là null ko

4 Likes

Ah, đúng rồi bạn, hàm main mình thiếu cái trường hợp này. Cảm ơn bạn nhiều nhaaaa :>>

2 Likes

Do comment của mình ở trên có sai sót nên mình comment xin lỗi bạn vì đưa thông tin sai nhé.

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?