为什么是这个结果

来源:百度知道 编辑:UC知道 时间:2024/05/31 01:29:45
朋友给我的这段c代码,用vc6.0运行的结果是
Hello World!
72
怎么回事?请告诉理由!
代码
#include "stdio.h"
int f1(int in)
{return (int)((char*)*((int*)(*((int*)(*(&in-2))))-2))[in];}
void f2(){printf("%d",f1(12));}
main()
{puts("Hello World!");
char *p[2]={"Beijing","shanghai"};
f2();getchar();}

请详细说明!谢谢
主要是问在vc6.0上运行结果的理由.谢谢L_o_o_n_i_e的回答,忘了说一下,是在cpp格式下运行的.程序声明顺序不调整

用vc6实验,f1的返回值相当于p[in],在常量区指向Hello的第一个字母H~

嗯嗯,不好意思~>_<

完全是对地址的不合法调用
f1(12)的返回值根据编译器的不同,内存分配的不同而不同
严格的说也不是随机的,&in-2是in入栈前一个入栈的变量,这里应该是f2()的入口地址,总之这个根据编译器的不同而不同,而且如果你之前修改了程序运行,然后再改回去运行,结果都是不同的,所以研究它实在没什么意义

声明应当在语句前面:
char *p[2]={"Beijing","shanghai"};
puts("Hello World!");

-----------------------------------------
puts("Hello World!");
就是打印一行字符 Hello World!
所以你的第一行是Hello World!

f2(); 是调用函数
void f2(){printf("%d",f1(12));}
执行打印语句 printf("%d",f1(12));
打印数值 是 函数 f1( ) 送返值,实参12。

f1(12) 执行
int f1(int in)
{return (int)((char*)*((int*)(*((int*)(*(&in-2))))-2))[in];}

现在 in = 12;
(int)((char*)*((int*)(*((int*)(*(&in-2))))-2))[12];
&in 的值 是地址,是随机的。
(char*) * (..) 标准C语言没有定义,这段地址计算 结果 取决于编译器。

vc6.0运行的结果 应当是在 char *p[2]={"Beijing","shanghai"};
地址区。