C语言规定,函数返回值的类型由什么决定?
函数返回值类型取决于定义函数时,函数名前的类型关键字。 函数定义的格式: 类型关键字 函数名 () { } 比如: int name () { } 类型关键字: 关键字void表示无返回值,其他的关键字和声明变量时表示的含义一样。 如int表示返回int类型,double表示返回double类型。
C语言函数返回值什么意思?
return后接一个值。在调用这个函数的函数里面,调用它的时候希望获得一个值,如果不希望获得这个值的时候,用void声明就好。
如果需要,比如说需要得到一个整形值就声明int func()在调用它的比如main里面func()的作用就可以相当于一个int型常数比如外面定义了int max(int a,int b){return a>b?a:b;}主函数里面是main(){int A;A=max(1,2);}这时候就是通过max计算 1>2 则return 一个1 ,1<2 则return一个2。很明显1<2 所以这里max(1,2)就会return 一个 2这时候主函数里的max(1,2)就相当于一个常数 2A=max(1,2)的作用就相当于A=2这个意思。
c语言中函数返回值可以是数组、字符串和结构体吗?
不可以。
因为在C语言中函数不能返回数组,但字符串是存储在字符数组中的,所以能C语言中实现函数返回字符串,首先要确定函数返回的字符串地址的来源,一般分为四种方式: 函数形参带进来的地址 静态局部变量地址 局部变量地址,必须在函数中用malloc()函数进行地址分配 采用全局变量地址 参考代码: void func1( char *s)
既然C语言函数的局部变量会被释放,那为什么函数还可以把它return返回呢?
看了底下兄弟的答复,只能说答对了一半。
真正的原因在于ABI(应用程序二进制接口)。
ABI定义了与系统交互的细节:如数据类型、大小和对齐;调用约定(控制函数的参数的传递方向、可变长度处理、堆栈清理主体以及如何接受返回值等);系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。一个完整的ABI,像Intel二进制兼容标准 (iBCS),允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。
其他的 ABI 标准化细节还包括 C++ 名称修饰 ,和同一个平台上的编译器之间的调用约定,但是不包括跨平台的兼容性。
至于底下兄弟所说的EAX保存返回值,这个只是X86的ABI规范,在PowerPC等其他CPU架构平台,实现是不一样的!——PowerPC下,返回值是保存在R3寄存器中的
谢邀。
C语言函数的局部变量在函数执行完毕后,会被释放,相信即使是C语言初学者,也是了解这一点的。不过,我们在函数中定义一个局部变量,却是可以通过 return 语法将其返回给调用者的,这也许就是题主的疑惑之处。
C语言函数怎么可以把一个被释放的值返回给调用者使用呢?
请看下面这张图,进一步来说,C语言程序每调用一个函数,就会在栈区为其分配一块区域,所有局部变量都是在这块区域里存放的,函数执行完毕返回后,系统自动就将这块区域收回了。
这块区域较为正式的名字叫“栈帧”。
既然函数的局部变量都存放在栈区,栈区在函数返回就释放了,那为什么 add 函数还能把局部变量返回呢?
其实函数返回的并不是局部变量,而是局部变量里面存放的数据
我们用鞋柜来比喻局部变量,用鞋子来比喻数据。我们想取出的是鞋子,而不是鞋柜,对吗?
以我的机器为例,在函数执行完毕后,系统会先将返回值暂存在寄存器 eax 里,所以即使函数的栈帧被系统收回了,它的返回值依然在 eax 里保存的很好。函数返回后,系统再把返回值从 eax 中取出,赋值给调用者。请看下面这个例子:
我们查看它的汇编代码,发现一切和我们预料的一致:
从汇编代码可以看出,C语言的 return 实际上返回的是是将局部变量里的值,而不是直接返回局部变量。
不过,因为返回值是存放在局部变量里的,而局部变量被释放了,所以必须再为该值找一个“容器”,该“容器”在本例中就是 eax 寄存器。
总结一下
题目所说的“C语言函数返回局部变量”这一过程是这样的:在局部变量被释放之前,C语言程序将存放在其中的值暂时存放到 eax 寄存器中,eax 是不会被释放的,所以函数执行完毕后,return 仍然能将其中的值返回给调用者。
欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。