使用
这应该在三行连续打印“there.”、“you?”和“fine.”,目前使用clang和gcc都可以,您可以在wandbox上验证。但是,我不确定这些指针转换和算术是否违反了某些规则,从而导致行为变得未定义。
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);
}
}
这应该在三行连续打印“there.”、“you?”和“fine.”,目前使用clang和gcc都可以,您可以在wandbox上验证。但是,我不确定这些指针转换和算术是否违反了某些规则,从而导致行为变得未定义。
offsetof
的用法感兴趣。 - Ben Steffantest[i].b
直接访问成员将会进行必要的指针算术运算,但是保证正确行为,而指针 hack 则不能保证。并且由于它是常见情况,编译器设计者会专注于对其进行优化,而可能无法有效地优化指针 hack。可以想象一种情况,即test[i].b
编译为单个load
指令,而手动算术则作为单独的步骤后跟随一个load
。 - zstewart