Chuẩn C cho phép các con trỏ đến các loại khác nhau có kích thước khác nhau, ví dụ: sizeof(char*) != sizeof(int*)
được cho phép. Tuy nhiên, nó yêu cầu rằng nếu một con trỏ được chuyển đổi thành void*
và sau đó được chuyển đổi về kiểu gốc của nó, nó phải so sánh với giá trị ban đầu của nó. Do đó, nó theo logic một cách hợp lý rằng sizeof(void*) >= sizeof(T*)
cho tất cả các loại T
, đúng không? Trên các nền tảng phổ biến nhất được sử dụng ngày nay (x86, PPC, ARM và 64-bit, vv), kích thước của tất cả các con trỏ bằng kích thước đăng ký gốc (4 hoặc 8 byte), bất kể đánh máy. Có bất kỳ nền tảng bí truyền hoặc nhúng nào trong đó các con trỏ đến các loại khác nhau có thể có kích thước khác nhau không? Tôi đặc biệt hỏi về dữ liệu con trỏ, mặc dù tôi cũng muốn biết liệu có các nền tảng có chức năng hàm có kích thước không bình thường hay không.Có nền tảng nào mà con trỏ đến các loại khác nhau có kích thước khác nhau không?
Tôi chắc chắn là không phải hỏi về các hàm trỏ-thành viên của C++ và các hàm con trỏ tới thành viên. Những người có kích thước bất thường trên nền tảng phổ biến và thậm chí có thể thay đổi trong một nền tảng, tùy thuộc vào thuộc tính của lớp con trỏ (không đa hình, thừa kế đơn, đa thừa kế, thừa kế ảo hoặc loại không đầy đủ).
Tò mò, phần nào của tiêu chuẩn cho phép các kích thước con trỏ khác nhau? Bạn có nhớ gửi phần đó – JaredPar
Nit-pick: "kiểu gốc nguyên gốc" trong C phải là int, hiếm khi 64 bit ngay cả trên nền tảng 64 bit, AFAIK. Nói cách khác, LP64 phổ biến hơn ILP64. – unwind
@JaredPar: Tôi không chắc chắn chính xác vị trí của nó trong tiêu chuẩn, nhưng trang này http://www.lysator.liu.se/c/rat/d9.html#4-9-6-1 đề cập đến của nó, liên quan đến định dạng% p fprintf specifier. @unwind: s/nguyên số nguyên/kích thước đăng ký bản địa/ –