请问C语言中一个函数没有return它返回什么?
答案:3 悬赏:70 手机版
解决时间 2021-02-22 00:47
- 提问者网友:骑士
- 2021-02-21 19:25
请大神举个例子
最佳答案
- 五星知识达人网友:一叶十三刺
- 2021-02-21 20:34
首先是猜想,主流平台上,函数返回都是通过某个通用寄存器返回,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 社区版。
希望有所帮助。
证实:为了证实,需要写一点代码,一个最简单的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 社区版。
希望有所帮助。
全部回答
- 1楼网友:往事隔山水
- 2021-02-21 21:32
什么都不反悔啊
- 2楼网友:三千妖杀
- 2021-02-21 21:16
C语言的函数如果没有return,那一定就是一个返回值为void的函数,表示不返回任何值,只是函数的代码返回了,也就是执行在汇编层面上的ret指令来结束函数的调用。返回值为void的函数其实也可以用return,但是return后面不加任何变量,表示仅仅返回函数的代码,只用于结束函数的调用。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯