c语言幻数游戏,C中的幻数

我想使用一个幻数作为常量来检查是否违反了内存块,是否有一种"反向检查"方法将签名恢复为十六进制格式MAGIC_32BIT

#define MAGIC_32BIT 0x77A5844CU

int signature = (int)MAGIC_32BIT;

另外,我想使用更具创造力的魔术数字,关于生成数字或遵循规则的任何想法? 没有冒犯,但我听说过Microsoft的0xB16B00B5,并希望我的语言对人类更具"可读性"。

0xBADF00D? 虽然不是我的发明,但苹果已经将其用于崩溃日志,但是它很容易被人读懂。

只要有创造力。 查看看起来映射到字母字母的十六进制数字(如果您足够睁开眼睛,几乎全部都用十六进制数字表示)并制作一些单词。 实验。

以下是列表:http://en.wikipedia.org/wiki/Hexspeak#Notable_magic_numbers

我知道此回复可能无法回答您的问题,但我仍然希望它能有所帮助。

您的"魔数"实际上应该取决于您的应用程序以及要检测或期望的内存损坏类型。

我已经看到过使用0xEE初始化任务整个堆栈的操作系统,该值既易于识别,也不可能被大多数人使用。该方法可用于通过计数0xEE字节来估算未使用的堆栈空间量。完美吗?但它很快((相当)便宜且容易实现)。这样做的好处之一是,您有时可以轻松地识别出哪些字节已损坏(例如,如果在0xEE字节中有几个非0xEE字节)。基本思想应该可以转移到其他领域。

您可以采用自定义路线,并且每个数据结构都有一个唯一的幻数-例如CRC。它更昂贵,但是在检测数据结构是否已损坏时会更好。它不会告诉您损坏的位置/方式/时间,而仅告诉您是否损坏。不幸的是,这将使您的可读请求失败。

如果您的内存块足够大,则可以通过默认情况下禁用对它们的写入,并仅在需要进行更改的时间内启用它们,来利用MMU并保护您的内存块。此方法可能会有一些写入性能的损失,但是它可以帮助检测损坏的时间,地点和人员。这完全消除了幻数。

希望这可以帮助。

是的,我找到了答案,直接检查了宏,ceffault的Wiki评论显示int变量可以互换,而无需使用强制转换。

#define MAGIC_NUM 0x8BADF00D

#define CHECK_SIG(A) (A == MAGIC_NUM)

嗯,听起来您将在不了解C的基本知识的情况下做一些低级的内存工作。也许您应该首先学习有关类型系统和提升规则的所有知识。 C给您所有自由去做您想做的事,但是您应该始终知道自己在做什么。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值