Câu hỏi này là về con trỏ bắt nguồn bằng cách sử dụng số học con trỏ với cấu trúc bù đắp.Cấu trúc bù đắp và an toàn con trỏ trong C++
Hãy xem xét các chương trình sau đây:
#include <cstddef>
#include <iostream>
#include <new>
struct A {
float a;
double b;
int c;
};
static constexpr auto off_c = offsetof(A, c);
int main() {
A * a = new A{0.0f, 0.0, 5};
char * a_storage = reinterpret_cast<char *>(a);
int * c = reinterpret_cast<int *>(a_storage + off_c));
std::cout << *c << std::endl;
delete a;
}
chương trình này xuất hiện để làm việc và đưa ra kết quả mong đợi trên các trình biên dịch mà tôi thử nghiệm, sử dụng các thiết lập mặc định và C++ 11 tiêu chuẩn.
(Một chương trình có liên quan chặt chẽ, nơi mà chúng tôi sử dụng void *
thay vì char *
và static_cast
thay vì reinterpret_cast
, không chấp nhận rộng rãi. gcc 5.4
vấn đề một cảnh báo về con trỏ số học với con trỏ void, và clang 6.0
nói rằng con trỏ số học với void *
là một lỗi.)
Chương trình này có hành vi được xác định rõ theo tiêu chuẩn C++ không?
Câu trả lời có phụ thuộc vào việc triển khai có an toàn cho con trỏ thoải mái hay nghiêm ngặt ([basic.stc.dynamic.safety]
) không?
đây có phải là bài tập về nhà không? –
@GarrGodfrey: Tôi sẽ ngạc nhiên ... –
Tại sao không sử dụng con trỏ đến chức năng thành viên của C++. Đó là "sạch" thay thế cho 'offsetof'? –