首页 > 代码库 > 一个混乱的 C 程序
一个混乱的 C 程序
一个混乱的 C 程序如下,它能正常运行么?如果能的话, 打印出什么?
main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}
解析:
在 unix 系统中,unix 是一个宏定义,其值为 1。就像是 #define unix 1
数组 array 的下标可以放在中括号里面,也可以与数组位置调转。
array[index] 和 index[array] 是等价的。
所以 &unix["\021%six\012\0"] 就是 &1["\021%six\012\0"] 就是 &"\021%six\012\0"[1] ,
\021 八进制表示的一个字符,下标 1, 跳过它就是从 %s 开始的字符串: "%six\012\0"
\012 就是 ASCII 码 10,就是 \n,所以程序就是
main() { printf("%six\n\0",(unix)["have"]+"fun"-0x60);}
后面的 (unix)["have"] 就是 1["have"],就是字符 ‘a‘。
所以 (unix)["have"]+"fun"-0x60 就是 ‘a‘ + "fun" - 0x60;
字符在做加法运算时取它的 ASCII 码,这里就是 0x61,
所以 0x61 +"fun" - 0x61,字符串参于运算时是地址参于运算,所以这里变成了 "fun" 从第 2 个字符开始的串,也就是 "un";
所以上面的程序就是
main() { printf("%six\n\0", "un";}
打印出来就是
unix
一个混乱的 C 程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。