c语⾔中临时变量的作⽤,C语⾔临时变量不能作为函数的返回
值?
这个问题⼀直纠结啊,不明⽩其中的原理,总是记不住,那些临时变量是不能作为返回值的?
上⽹查了⼀下,结合经验陈述如下。
原理:
⾸先需要明⽩⼀件事情,临时变量,在函数调⽤过程中是被压到程序进程的栈中的,当函数退出时,临时变量出栈,即临时变量已经被销毁,临时变量占⽤的空间没有被清空,但是已经可以被分配给其他变量了,所以有可能在函数退出时,该内存已经被修改了,对于临时变量来说已经是没有意义的值了。
C语⾔⾥规定:16bit程序中,返回值保存在ax寄存器中,32bit程序中,返回值保持在eax寄存器中,如果是64bit返回值,edx寄存器保存⾼32bit,eax寄存器保存低32bit。
由此可见,函数调⽤结束后,返回值被临时存储到寄存器中,并没有放到堆或栈中,也就是说与内存没有关系了。当退出函数的时候,临时变量可能被销毁,但是返回值却被放到寄存器中与临时变量的⽣命周期没有关系。
如果我们需要返回值,⼀般使⽤赋值语句就可以了
A a = func();
综上,函数是可以将临时变量的值作为返回值的。
但是将⼀个指向局部变量的指针作为函数的返回值是有问题的。
由于指针指向局部变量,因此在函数返回时,临时变量被销毁,指针指向⼀块⽆意义的地址空间,所以⼀般不会有返回值。
如果得到正常的值,只能是幸运的,因为退出函数的时候,系统只是修改了栈顶的指针,并没有清内存;所以,是有可能正常访问到局部变量的内存的。但因为栈是系统⾃动管理的,所以该内存可能会可以被分配给其他函数,这样,该内存的内容就会被覆盖,不再是原来的值了。
常规程序中,函数返回的指针(函数指针,数组指针,结构体指针,联合体指针等)通常应该是:
(1)指向静态(static)变量;
(2)指向专门申请分配的(如⽤malloc)空间;
(3)指向常量区(如指向字符串"hello");
(4)指向全局变量;
(5)指向程序代码区(如指向函数的指针)。
除这5项以外,其它怪技巧不提倡。
指针函数的作用函数内的变量,没有关键字static修饰的变量的⽣命周期只在本函数内,函数结束后变量⾃动销毁。当返回为指针的时候需要特别注意,因为函数结束后指针所指向的地址依然存在,但是该地址可以被其他程序修改,⾥⾯的内容就不确定了,有可能后⾯的操作会继续⽤到这块地址,有可能不会⽤到,所以会出现时对时错的情况,如果需要返回⼀个指针⽽⼜不出错的话只能调⽤内存申请函数
对于结构体和联合体来说,在作为函数的参数和返回值时,表现与C语⾔的内置类型(int,float,
char等)是⼀样的,当为临时变量的时候,作为返回值时有效的。这个也是与指针不同的地⽅,所以⼀定要区分好,总是为当返回结构体或者联合体的时候,该怎么处理,原来直接返回就可以了。(不要与结构体指针或者联合体指针弄混了,他们是指针,不是⾃定义数据类型
^_^)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论