为了账号安全,请及时绑定邮箱和手机立即绑定

帮分析一下 这段C代码

帮分析一下 这段C代码

牛魔王的故事 2019-04-16 17:05:22
看到下面代码c#define_MARK(p,mark)*((unsigned*)(p+strlen(p)+1))=(mark)#defineIS_MARK(p)(*(unsigned*)(p+strlen(p)+1)==0x6A8FCE84)p是一个字符串指针,_MARK就是将字符串后台\0替换掉。IS_MARK是判断是否存在标记的这个值。对于前面的unsigned*以及最前的*有些疑惑?为什么要强制转换为unsigned*?
查看完整描述

2 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

如果p是字符串指针,那么#define_MARK(p,mark)*((char*)(p+strlen(p)+1))=(mark)这样子赋值只会对p+strlen(p)+1指向地址的一个8位的字符类型数据有效,也就是\0后面的8位。而#define_MARK(p,mark)*((unsigned*)(p+strlen(p)+1))=(mark)会将\0后面的32位当作一个无符号整形,那么赋值会对这32位有效。
#defineIS_MARK(p)(*(unsigned*)(p+strlen(p)+1)==0x6A8FCE84)同理。
所以根本不是吧\0替换掉啊。。。
不过你确定这样子做在某些时候不会发生奇怪的事情。。。?
                            
查看完整回答
反对 回复 2019-04-16
?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

为了符合语境(context),这样的话,
一来编译器不会报警告
二来读程序的人也会更加明白
说到底你要是不写unsigned*那也是可以的
                            
查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 346 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信