如何在LSB指针位中正确存储额外数据?

时间:2018-06-27 00:51:04

标签: c pointers bit-manipulation glib

我有一个来自GTK / glib 2的GSList,那些只存储完整的指针,我真的不想要额外的分配。我该如何摆弄黑客来在这些指针中存储额外的数据?

我认为我不能只是拿一个指针来做tagged_ptr = ptr | 1(实际上,当我尝试时,编译器会大声抱怨)。我不确定该怎么做。

这绝对是单个函数的局部变量,并且GSList(或指针)不会泄漏到其余代码中。

1 个答案:

答案 0 :(得分:2)

要对指针的数值执行算术运算(与指针算术相反,指针算术不同且受到严格限制),您需要来回转换为适当的整数类型。如果stdint.h定义了UINTPTR_MAX,则要使用的适当类型是uintptr_t。如果不是,则没有适当的类型,并且您的(不可移植的)hack无法在该特定实现上使用。

请注意,您还存在假设指针的未使用位低的问题。如果_Alignof(max_align_t)大于1,则这可能是一个合理的假设,假设实现遵循标准的意图,即向uintptr_t的转换反映了实现的地址模型(而不是任意注入)。但是,如果没有,那么您就不走运了。