假设我有一个结构并将偏移量提取到一个成员:
struct A {
int x;
};
size_t xoff = offsetof(A, x);
struct A
给定一个指针以符合标准的方式提取成员,我该如何做?当然假设我们有一个正确struct A*
和正确的偏移量。一种尝试是执行以下操作:
int getint(struct A* base, size_t off) {
return *(int*)((char*)base + off);
}
这可能会起作用,但请注意,例如,如果指针是同一数组的指针(或结束后的指针),则指针算术似乎仅在标准中定义,情况并非如此。因此从技术上讲,该构造似乎依赖于未定义的行为。
另一种方法是
int getint(struct A* base, size_t off) {
return *(int*)((uintptr_t)base + off);
}
这也可能会起作用,但请注意,intptr_t
它不需要存在,据我所知,算法intptr_t
不需要产生正确的结果(例如,我记得某些 CPU 有能力处理非字节对齐的地址,这将建议intptr_t
以 8 的步长为每个char
数组中的每个增加)。
看起来标准中忘记了一些东西(或者我错过了一些东西)。