30/09/2018, 17:24

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…

Trần Toàn viết 19:37 ngày 30/09/2018

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

Mai Anh Dũng viết 19:38 ngày 30/09/2018

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ỉ…

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.

Ngo Dinh Quyen viết 19:28 ngày 30/09/2018

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 ạ…

Mai Anh Dũng viết 19:35 ngày 30/09/2018

Đú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.

Ngo Dinh Quyen viết 19:37 ngày 30/09/2018

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

Mai Anh Dũng viết 19:31 ngày 30/09/2018

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

Hiện nay thành viên đã có thể đặt câu hỏi và chọn câu trả lời đúng trong Category #programming và #randomq, thế nên ai đã đặt câu hỏi và nhận câu trả lời chính xác thì nhớ chọn câu trả lời đúng để cảm ơn người trả lời nhé. Nếu người hỏi tự trả lời được câu hỏi thì nên post solution của mình và tự chọn luôn đó là câu trả lời đúng để cho người sau vào sẽ biết cách giải quyết. Các categories được chọn câu trả lời đúng programming randomq Người đặt câu hỏi có thể chọn câu trả lời đúng bằ…
Ngo Dinh Quyen viết 19:24 ngày 30/09/2018

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

Bài liên quan
0