十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
首先是猜想,主流平台上,函数返回都是通过某个通用寄存器返回,x86平台是eax,arm是r0,所以猜想即使是void返回,如果硬是要得到返回值的话,应该是得到返回那一刻该寄存器的值。
创新互联公司成都企业网站建设服务,提供成都做网站、成都网站建设网站开发,网站定制,建网站,网站搭建,网站设计,自适应网站建设,网页设计师打造企业风格网站,提供周到的售前咨询和贴心的售后服务。欢迎咨询做网站需要多少钱:13518219792
证实:为了证实,需要写一点代码,一个最简单的void test(){},一个main(){printf("%d", test())},然而这样并不行,无法通过编译,需要使用手段,代码如下
void test()
{
return;
}
typedef int(*F)(void);
int main()
{
F f = (F)test;
printf("%d\n", f());
return 0;
}
对,就是把函数强制转换为返回int再调用,结果并不出人意料,是-858993460,这个数看起来没什么意义,不过转成16进制就有意义了,它是0xcccccccc,在VS的debug过程中,eax总是被初始化成这个值,堆栈内数组也是如此,同时它也是著名的"屯屯屯屯"的来源。
再把test改一下,进一步验证,试图让它返回0,办法是把eax变成0:
void test(){
int i = 1;
i--;
return;
}
猜想这次会输出0,因为i会放进eax里,再进行自减运算,结果也得到证实。
机器环境,win10 64bit,IDE,visual studio 2015 社区版。
希望有所帮助。
这是错误,既然函数定义要返回值,就返回一个值,不返回结果是未知的 c语言可以允许这样的代码,c++视为错误
这是vc2017结果:
deubg模式结果是4,release结果是0, 所以这个代码没有意义
debug模式 结果是4
release模式 结果是0
也可以这样:#includevoidmain()//void标识无返回值{inta,b,sum;a=1,b=2;sum=a+b;printf("sumis%d\n",sum);}
这种属于函数返回值的隐式声明。 隐式声明的函数返回值类型都是int 当然了,这个只需要了解一下就好了。不建议这么写。 现在很多编译器都不允许这样的声明出现。如果C语言中调用函数前面没有定义它的返回值类型