4个回答
展开全部
首先是猜想,主流平台上,函数返回都是通过某个通用寄存器返回,x86平台是eax,arm是r0,所以猜想即使是void返回,如果硬是要得到返回值的话,应该是得到返回那一刻该寄存器的值。
证实:为了证实,需要写一点代码,一个最简单的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语言的函数如果没有return,那一定就是一个返回值为void的函数,表示不返回任何值,只是函数的代码返回了,也就是执行在汇编层面上的ret指令来结束函数的调用。返回值为void的函数其实也可以用return,但是return后面不加任何变量,表示仅仅返回函数的代码,只用于结束函数的调用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
main没有return函数,则默认返回一个随机值。启动该程序的进程不能判断该程序是正常结束还是非正常结束
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
什么都不反悔啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询