浏览看雪论坛,发现有人讲了一个有趣的C语言程序。原帖地址:http://bbs.pediy.com/showthread.php?p=389887
我做了一点点的修改,最后打印出 i O y(中间那个是个心的形状,运行程序就知道了)
#include
int main()
{
const short int c1 = 49920;
const int c2 = 1073742008;
int (*pf)() = (int (*)())&c2;
printf("%c %c %c\n", *((char*)pf()+1)-0x11,*(char*)pf()-0x4a, *((char*)pf()+1)-0x1);
return 0;
}
这两句代码:
const short int c1 = 49920;
const int c2 = 1073742008;
const short int c1 = 0xc300;
const int c2 = 0x400000b8;
这两个变量占据了连续的空间。变量赋值后,从0x12fff40开始的内存单元存储的字节码为:B8 00 00 40 00 C3 。对应的汇编码是:
mov eax,400000h
ret
接下来的这句:
int (*pf)() = (int (*)())&c2;
接下来,
printf("%c %c %c\n", *((char*)pf()+1)-0x11,*(char*)pf()-0x4a, *((char*)pf()+1)-0x1);