使用 进行指针运算时offsetof
,获取结构的地址,将成员的偏移量添加到其中,然后取消引用该地址以获取基础成员,这是明确定义的行为吗?
考虑以下示例:
#include <stddef.h>
#include <stdio.h>
typedef struct {
const char* a;
const char* b;
} A;
int main() {
A test[3] = {
{.a = "Hello", .b = "there."},
{.a = "How are", .b = "you?"},
{.a = "I\'m", .b = "fine."}};
for (size_t i = 0; i < 3; ++i) {
char* ptr = (char*) &test[i];
ptr += offsetof(A, b);
printf("%s\n", *(char**)ptr);
}
}
这应该打印“那里。”,“你?” 和“好”。在三个连续的行上,它目前使用 clang 和 gcc,因为您可以在wandbox上验证自己。但是,我不确定这些指针转换和算术是否违反了某些会导致行为未定义的规则。