Linux stddef.h định nghĩa offsetof()
như:Tại sao trừ con trỏ null trong offsetof()?
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
trong khi các bài viết Wikipedia trên offsetof()
(http://en.wikipedia.org/wiki/Offsetof) định nghĩa nó như:
#define offsetof(st, m) \
((size_t) ((char *)&((st *)(0))->m - (char *)0))
Tại sao trừ (char *)0
trong phiên bản Wikipedia? Có trường hợp nào thực sự tạo nên sự khác biệt không?
Bạn không nên sử dụng/nghiên cứu mã có thể gọi hành vi không xác định, như ở trên. Việc triển khai có thể sử dụng các hacks skanky như vậy vì họ biết những hành vi không xác định nào hoạt động bí mật. Nhưng những gì "bí mật hoạt động" là hoàn toàn không di động. – CTMacUser