2011-02-09 66 views

Trả lời

7

Mặc dù nó có thể không chính xác 100% hợp pháp, điều này sẽ hoạt động reinterpret_cast<unsigned char*>(buf).


Lý do này không phải là 100% về mặt kỹ thuật pháp lý là do phần 5.2.10 expr.reinterpret.cast đạn 7.

Một con trỏ đến một đối tượng có thể được chuyển đổi một cách rõ ràng để một con trỏ đến một đối tượng của một loại khác. loại ban đầu mang lại giá trị con trỏ ban đầu, kết quả của việc chuyển đổi con trỏ như vậy không được chỉ định.

Tôi lấy ý nghĩa là *reinterpret_cast<unsigned char*>(buf) = 'a' không được chỉ định nhưng *reinterpret_cast<char*>(reinterpret_cast<unsigned char*>(buf)) = 'a' là OK.

+0

Nếu tôi nhớ chính xác tiêu chuẩn, có một ngoại lệ cho rằng sử dụng con trỏ để char [[un] signed] được phép truy cập bộ nhớ của đối tượng thuộc bất kỳ loại nào. Tôi nghĩ rằng nó làm cho hành vi của mã của bạn được xác định rõ. – HolyBlackCat

+0

@ HolyBlackCat Tôi không nhớ bất kỳ từ ngữ nào như vậy, nếu bạn có thể cung cấp một tham chiếu, tôi sẽ cập nhật câu trả lời. – Motti

+0

May mắn thay, tôi không thể tìm thấy một tài liệu tham khảo tiêu chuẩn. Nhưng tôi đã tìm thấy một số tuyên bố trên SO rằng có một ngoại lệ đối với quy tắc bí danh nghiêm ngặt đối với 'char *' (có nghĩa là "nó là hợp pháp để sử dụng con trỏ tới [[un] signed] char để truy cập bộ nhớ của một đối tượng thuộc bất kỳ loại nào "). Xem phần này: http://stackoverflow.com/a/99010/2752075 'Bạn có thể sử dụng char * để tạo răng cưa <...>. Các quy tắc cho phép một ngoại lệ cho char * (bao gồm char đã ký và char chưa ký). Nó luôn luôn giả định rằng char * aliases các kiểu khác. Tuy nhiên điều này sẽ không hoạt động theo cách khác: không có giả định rằng cấu trúc của bạn bí danh một bộ đệm của ký tự.' – HolyBlackCat

4

Chỉ cần truyền?

unsigned char *conbuf = (unsigned char *)buf; 
+4

trong C++, "Chỉ cần cast nó" luôn luôn cần một tuyên bố từ chối trách nhiệm :) – tenfour

+0

Heh-heh! Disclaimer: Câu trả lời này là tốt cho văn bản bạn hiển thị trong câu hỏi. Đừng thử trên các mảng có số 8 bit đã ký. – Dave

Các vấn đề liên quan