01/10/2018, 16:33

Puts and cout in C++

Chào mọi người,
Em có 2 hàm đảo ngược chuỗi, hàm đầu chỉ dùng được lệnh “puts” để in ra, còn hàm sau dùng “cout” và “puts” đều được.
Các tiền bối có thể giải thích giúp em vì sao lại như vậy không ạ? Em cảm ơn.

viết 18:45 ngày 01/10/2018

res là mảng chỉ tồn tại trong thân hàm 1, mảng này sẽ bị xóa tự động khi hàm 1 thực thi xong. Khi trả về con trỏ tới mảng res này sẽ trỏ tới vùng nhớ đã được giải phóng nên nó in ra giá trị rác. Lần xài puts in ra được là do xui mới in ra được, ko thấy được lỗi. Lần xài cout thì may mắn ko in ra được, thấy được lỗi.

1 hàm chỉ nên làm 1 nhiệm vụ. Hàm tên là đảo chuỗi sao lại có nhập chuỗi nào ở đây??

Thiên Nguyễn Vũ viết 18:36 ngày 01/10/2018

Em hiểu rồi, cảm ơn anh.

Thiên Nguyễn Vũ viết 18:44 ngày 01/10/2018

Nhưng anh ơi hàm puts nó có cơ chế gì lạ lắm, vì hàm 1 lỗi như anh nói nhưng lúc nào em dùng puts em cũng in ra được, chỉ khi dùng cout mới lỗi, em vẫn chưa hiểu tại sao dùng puts thì nó không bị lỗi.
Mong anh giải đáp. Cám ơn anh.

viết 18:35 ngày 01/10/2018

tại vì hên xui. Hên thì nó in ra bị lỗi, xui thì nó in ra bình thường.

ví dụ em đi thuê 1 căn nhà, hết hạn cho thuê (vùng nhớ được giải phóng), em vẫn ở lì ở đó (vẫn sử dụng vùng nhớ đã đc giải phóng) thì nếu em gặp “hên” ông chủ nhà chưa có người thuê mới (chương trình khác hoặc hàm/object khác sử dụng vùng nhớ này), nên em ở vẫn ko sao (in ra bình thường), còn em “xui” thì em gặp người thuê phòng khác, bày đồ tùm lum ra (in ra giá trị rác). Cả 2 trường hợp em đều phạm lỗi: ở lì căn nhà đã hết hạn cho thuê. Ở đây phải nói ngược lại, “hên” = xui vì nó làm em ko thấy lỗi, vẫn tưởng ở nhà ko trả tiền là ok, còn “xui” = hên vì nó chỉ cho em thấy liền: nhà của em đã hết hạn cho thuê

em gu gồ thêm “Dangling pointer” để đọc thêm: https://en.wikipedia.org/wiki/Dangling_pointer

hình từ wiki:

res của em sau khi thoát khỏi hàm 1 đã bị delete, nên em trả về con trỏ tới res là dangling pointer. Vùng nhớ của nó có bị xài hay chưa là chuyện khác. Nếu chưa bị xài thì em in ra giá trị cũ ko sao (bad), nếu bị xài rồi em sẽ in ra giá trị rác (good)

tốt nhất là em nên chạy ở chế độ Debug trước khi chạy chế độ Release, nó sẽ báo lỗi rõ hơn cho em thấy.

Thiên Nguyễn Vũ viết 18:45 ngày 01/10/2018

Tuyệt vời, em cảm ơn anh nhiều.

Bài liên quan
0