我有一个来自GTK / glib 2的GSList
,那些只存储完整的指针,我真的不想要额外的分配。我该如何摆弄黑客来在这些指针中存储额外的数据?
我认为我不能只是拿一个指针来做tagged_ptr = ptr | 1
(实际上,当我尝试时,编译器会大声抱怨)。我不确定该怎么做。
这绝对是单个函数的局部变量,并且GSList
(或指针)不会泄漏到其余代码中。
答案 0 :(得分:2)
要对指针的数值执行算术运算(与指针算术相反,指针算术不同且受到严格限制),您需要来回转换为适当的整数类型。如果stdint.h
定义了UINTPTR_MAX
,则要使用的适当类型是uintptr_t
。如果不是,则没有适当的类型,并且您的(不可移植的)hack无法在该特定实现上使用。
请注意,您还存在假设指针的未使用位低的问题。如果_Alignof(max_align_t)
大于1,则这可能是一个合理的假设,假设实现遵循标准的意图,即向uintptr_t
的转换反映了实现的地址模型(而不是任意注入)。但是,如果没有,那么您就不走运了。