这里所有的答案都说“你不能”,他们是对的。你不能。
但是,我甚至不敢提它
是
可以玩的游戏。这些游戏是
坏主意。
在任何情况下我都不推荐他们。
比赛是什么?将多余的数据位填充到地址的未使用部分中,然后在使用地址的任何地方将它们剥离出来。
所以假设您有指向32字节大小的结构或类的指针。如果您确保您的内存分配与32字节的地址对齐(这对于动态分配很容易,但对于堆栈地址来说更难保证),那么地址的低阶位将全部为0。这意味着在地址的底部有5个空闲位,足以放置标志、ID号、状态值等。存储空间是空闲的!
即使你有一个奇怪的结构大小,实际上任何C或C++编译器和操作系统都会将每个地址对齐到4个字节。
在64位中,通常可以在地址的高端找到大量的空闲位…很可能有16个空闲未使用的位,等待您。当然,这取决于操作系统。还有一个坏主意要考虑。你喜欢危险,不是吗?
两个缺点是:
你必须确保掩盖
在你尝试之前先把价值观拿出来
取消对指针的引用或传递指针
任何可以尝试的东西。这使得
丑陋的代码。
你跳得太远了
愚蠢的悬崖
危险。这就像喝一杯
一瓶龙舌兰酒和一个磨损的
用钢索套住饥饿的老虎。裸体。
有太多的方法,这将爆炸成臭虫,崩溃,和痛苦。还记得我说过编译器将内存至少对齐到4个字节吗?嗯,那是真的。直到你找到一个新的操作系统,而你是老虎的食物。
所以不要这样做。
但是,也就是说,这确实是一种向每个地址添加一点额外信息的方法,比如输入一个数字。你可能会在
every-byte-counts code
或
Obfusicated C.
附言:真的,我是认真的,不要这样做。即使你喜欢老虎。