01/10/2018, 14:20

Hỏi về con trỏ trong C

Chào mọi người, em có câu hỏi về con trỏ mong mọi người chỉ giúp.
Dòng tô đỏ 25.
(*p)->info = tt; có tác dụng gì ạ.

//Theo em nghĩ thì biến tt được lưu trong stack của hàm change(), nếu như lệnh trên trỏ con trỏ (*p)->info đến tt thì nó sẽ mất đi sau khi hàm thực hiện. Vậy có phải lệnh trên có tác dụng là auto gán giá trị của các phần tử bên trong tt cho (*p) -> info không ạ ?.

Xin cảm ơn mọi người ạ.

Tao Không Ngu. viết 16:35 ngày 01/10/2018

Hi Thân Hoàng.
Bạn up hết code lên. Nếu chỉ nhìm như vậy thì có vẻ như code của bạn tiềm ẩn lỗi.

Thân Hoàng viết 16:31 ngày 01/10/2018

Full code ạ:

links: https://bugs.vn/10007

rogp10 viết 16:24 ngày 01/10/2018

Code này không ổn vì bạn đang đưa chi tiết của CTDL (*pnext) vào kiểu sinhvien.

Còn dòng đó thì không mất đâu vì đó là copy nguyên con. Dòng ngay sau mới là có chuyện.

Thân Hoàng viết 16:22 ngày 01/10/2018

à, cái free(&tt) là lúc đấy em đang test thử thôi ạ

Thân Hoàng viết 16:32 ngày 01/10/2018

sr, lúc đấy em test thử nhưng quên chưa xóa, code em chạy đây ạ

// Anh cho em hỏi 2 câu hỏi ạ:

  1. Khi khai báo thongtin tt; thì tt có phải là con trỏ và được lưu ở heap segment không ạ ? Nói cách khác, biên lưu trữ struct có phải 1 con trỏ.
  2. Nếu nó không phải con trỏ thì lệnh (*p)->info = tt; có chức năng “copy nguyên con” như anh nói, nó sẽ thực hiện copy như thế nào ạ. Nó lần lượt gán các giá trị bên trong của tt cho (*p)->info, hay chỉ đơn thuần là trỏ con trỏ (*p)->info đến tt ạ.
    Cảm ơn anh!!
rogp10 viết 16:25 ngày 01/10/2018
  1. tt không phải con trỏ khi ta xem lại khai báo, và tt này ở stack area do khai báo trong hàm, từ malloc ra mới là heap.
  2. Gán luôn giá trị bạn.
kiencon viết 16:34 ngày 01/10/2018

Bạn không nên khai báo 1 node là 1 con trỏ, vì sau đó viết code dễ làm người khác hiểu lầm như dòng code (*p)->info=tt;
Thay vào đó khai báo struct sinhvien như struct thongtin.
Lúc này trong hàm main ta sẽ khai báo 1 con trỏ sinh viên và cấp phát bộ nhớ cho nó, bạn sẽ không thấy nhập nhằng giữa vùng nhớ heap và stack nữa.
Cái cần chú ý là không phải khai báo trong hàm thì nó nằm trên stack, ta khai báo tỉnh mà ko cấp phát bộ nhớ thì mới nằm trên stack, nếu khai báo động thì nằm ở đâu cũng sẽ ở trên heap mà thôi.

rogp10 viết 16:36 ngày 01/10/2018

Vấn đề lớn hơn là thớt không tách biệt CTDL và dữ liệu.

Cái cần chú ý là không phải khai báo trong hàm thì nó nằm trên stack, ta khai báo tỉnh mà ko cấp phát bộ nhớ thì mới nằm trên stack, nếu khai báo động thì nằm ở đâu cũng sẽ ở trên heap mà thôi.

Thực ra nó ntn: Khi ta viết thongtin t; thì t ở trên stack là đúng nhưng khi ta viết thongtin *p = malloc(sizeof(thongtin)); thì p ở trên stack và p trỏ vào heap :D, nói cách khác, đối tượng (nói chung) nằm trên heap.

Nhưng câu đầu khai báo biến t, câu sau khai báo con trỏ p, vậy “ở stack area do khai báo trong hàm” không sai. Trừ static ra.

Thân Hoàng viết 16:28 ngày 01/10/2018

Em cảm ơn mọi người nhiều ạ.

Tao Không Ngu. viết 16:20 ngày 01/10/2018

Hi Thân Hoàng.

  1. Code của bạn bị lỗi shadow copy
    http://minhhn.com/lap-trinh-c/tham-tri-tham-chieu-trong-lap-trinh-c-cplusplus/
rogp10 viết 16:34 ngày 01/10/2018

Để ý tt.name này không phải là con trỏ, nên đều là deep copy cả.

Thân Hoàng viết 16:22 ngày 01/10/2018

Hi anh, có phải anh đang muốn nhắc đến cái này không ạ ?

Ở đây em truyền con trỏ của con trỏ (nghĩa là kiểu **) chứ không phải truyển con trỏ anh ạ

Thân Hoàng viết 16:32 ngày 01/10/2018

Hi anh, em đã test và đúng là nó chỉ đơn thuần copy giá trị chứ không hề ảnh hưởng gì đến con trỏ.

Không biết nhận định của em qua hình test kia có đúng không ạ.

rogp10 viết 16:20 ngày 01/10/2018

Theo nguyên tắc C chỉ có truyền tham trị (p là tham số hình thức), nhưng tính chất của con trỏ được sử dụng để truyền tham biến (cho *p). Khi đã sửa lại p thì không còn tham biến nữa, đó là hình ở post 14.
Ở post 15 thongtin không có con trỏ nào (và đều là kiểu cơ bản) nên đều là deep copy.

Bài liên quan
0