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