Trường hợp nào thì không thể gán 2 biến cấu trúc cùng kiểu cho nhau?

Xin chào…Mình đang học C đến phần struct và mình muốn hỏi những trường hợp nào thì không thể gán 2 biến cấu trúc cùng kiểu cho nhau…thầy mình nói khi trong struct có con trỏ thì không thể gán 2 biến struct cho nhau nhưng sao mình test thử thì vẫn được nhỉ…

struct THUNGHIEM
{
        int a, *b;
};
typedef THUNGHIEM ThuNghiem;

int main()
{
         int a = 5, *b = &a;
        ThuNghiem Tn1, Tn2 = { 2, &b);
        Tn1 = Tn2;
}

nó không báo lỗi mà vẫn cho kết quả đúng…

1 Like

T nghĩ là khi cấp phát bộ nhớ động cho mảng mới xảy ra lỗi :grinning: t chưa thử cái này trong struct

1 Like

Thầy bạn nói chính xác rồi. Đối với các kiểu dữ liệu đơn giản như int, char, … thì không việc gì. Nhưng khi trong struct có con trỏ thì không được gán trực tiếp. Bản chất việc gán 2 struct là compiler sẽ copy toàn bộ vùng nhớ của struct này sang struct kia.

  • Nếu các biến trong struct là biến int thì compiler copy giá trị của biến int này sang biến int kia.

  • Khi ta cấp phát vùng nhớ cho con trỏ thì dữ liệu được cấp phát không được copy. Chỉ có địa chỉ mà con trỏ đang trỏ đến là được copy.

Dẫn đến ta sẽ có hai struct khác nhau, nhưng con trỏ trong 2 struct đó lại cùng trỏ về một vùng nhớ. Thao tác trên con trỏ của struct này sẽ thay đổi vùng nhớ của con trỏ trên struct khác. Nếu ta không hiểu rõ điều này sẽ gây ra những lỗi khó hiểu và nguy hiểm.

Anh ltd và nartoan96 cho em hỏi thêm với ạ…theo những gì anh nói thì mình có thể gán được cho dù có con trỏ, nhưng không nen làm thế vì có thề gây nhàm lẫn phải không ạ…

Đúng vậy. Khi mình gán compiler sẽ không báo lỗi gì cả. Nó chỉ đơn giản sử dụng lệnh memcpy để copy vùng nhớ từ struct này sang struct khác. Nó không quan tâm đến việc copy cả vùng nhớ đã cấp phát cho con trỏ.

P/S: Có thể compiler không sử dụng lệnh memcpy mà sử dụng một cách nào đó khác để copy vùng nhớ. Nhưng Đạt đưa ra ví dụ sử dụng memcpy cũng tương đương về mặt ý nghĩa.

vâng em hiểu rồi ạ…cảm ơn anh ltd và nartoan96 nha…

Em có thể chọn một câu trả lời nào em thấy đúng rồi chọn accept anser bằng cách bấm vào dấu

em làm rồi đó anh…rút kinh nghiệm…

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