码迷,mamicode.com
首页 > 其他好文 > 详细

一个混乱的 C 程序

时间:2014-09-22 15:41:23      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:ar   c   amp   ef   r   as   程序   字符串   print   

一个混乱的 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 程序

标签:ar   c   amp   ef   r   as   程序   字符串   print   

原文地址:http://my.oschina.net/xhan/blog/316923

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!