首页 > 帮分析一下 这段C代码

帮分析一下 这段C代码

看到下面代码

c#define _MARK(p, mark) *((unsigned *)(p + strlen(p) + 1)) = (mark)

#define IS_MARK(p) (*(unsigned *)(p + strlen(p)+ 1) == 0x6A8FCE84)

p是一个字符串指针,_MARK就是将字符串后台\0 替换掉。
IS_MARK是判断是否存在标记的这个值。

对于前面的unsigned * 以及最前的*有些疑惑?
为什么要强制转换为unsigned * ?


根据代码判断,你的mark应该在传值的时候,应该使用unsigned int类型。


为了符合语境(context),这样的话,
一来编译器不会报警告
二来读程序的人也会更加明白

说到底你要是不写unsigned *那也是可以的


如果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位有效。

#define IS_MARK(p) (*(unsigned *)(p + strlen(p)+ 1) == 0x6A8FCE84)同理。

所以根本不是吧\0替换掉啊。。。

不过你确定这样子做在某些时候不会发生奇怪的事情。。。?

【热门文章】
【热门文章】