0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言如何处理函数的返回值

学益得智能硬件 ? 来源:学益得智能硬件 ? 2025-01-16 09:21 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

当你在函数的最后写上 return 0 的时候,它是如何返回给调用函数的?

比如 test 函数,为了待会更好的看懂汇编代码,我写成了 return 1234。

处理函数的返回值,是不是像我们理解的那样,直接把 1234 赋值给了变量 ret?

搞懂这个问题不难,只要看下汇编代码就行。

把代码编译一下,只编译不链接,得到的就是C对应的汇编代码。

这块是 test 函数,不用管上面这些代码,如果一行一行去分析,没有汇编基础的话确实会头疼。

看下这行代码,很明显,1234 就是我刚才写的返回值。所以 return 1234,其实就是把 1234 放到了寄存器 EAX 中。

EAX 是 X86 架构下的 32 位寄存器,在这个地方用于保存函数的返回值。

在回到主函数,通过 call 指令调用了 test 函数,紧接这就把 EAX 寄存器的值放到了 RBP 寄存器减 4 个字节的地址处,这个地址就是局部变量 ret 的地址。

所以这个过程非常简单,test 函数把返回值 1234 放到寄存器 EAX 中,主函数再从 EAX 把数据读到 ret 中。

把代码修改下,如果返回的是指针,指针占 8 个字节,汇编代码中也只是把 EAX 寄存器换成了 RAX 寄存器,这是一个 64 位的寄存器,刚好可以存放 8 个字节的指针。

不管函数返回什么类型,char short int long 或者指针,都可以通过这两个寄存器来完成。

于是又有了新的问题,如果返回结构体怎么办?结构体的大小可能远远超过 8 个字节。

之前我们也讲过这个问题,不同的编译器处理方法可能不一样。

比如我用的环境,调用函数之前,把局部变量 ret 的地址作为参数传给了 test 函数,实际上,我们在写代码的时候,test并没有参数。最终返回结构体,其实通过传进来的指针,把结构体的内容复制到了变量 ret 里面。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7633

    浏览量

    142125
  • 函数
    +关注

    关注

    3

    文章

    4384

    浏览量

    65130

原文标题:C语言如何处理函数的返回值

文章出处:【微信号:学益得智能硬件,微信公众号:学益得智能硬件】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问CY68013上位机发送的返回值到底代表什么意思?

    ,为0时代表发送失败,刚开始一直没问题,FPGA端接收也正常,上位机返回值也是1, 最后返回值一直是0,所以我一直认为发送失败了,但是今天在FPGA一端抓波形发现,数据是发送过去了的,请问这个返回值到底是什么意思? 在FPGA端
    发表于 05-22 07:16

    如何把两个数据返回给调用函数

    函数处理结果包含两个数据,如何把两个数据返回给调用函数? 第一种,把两个数据封装成一个结构体,函数返回
    的头像 发表于 01-08 10:15 ?447次阅读

    EE-128:C语言中的DSP:从C调用汇编类成员函数

    电子发烧友网站提供《EE-128:C语言中的DSP:从C调用汇编类成员函数.pdf》资料免费下载
    发表于 01-07 13:48 ?0次下载
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>语言</b>中的DSP:从<b class='flag-5'>C</b>调用汇编类成员<b class='flag-5'>函数</b>

    C语言笔试题

    来看一个C语言笔试题,应该很少有人能给出正确答案。 #include int f(){ printf("this is f ..."); return 1;}int g(){ printf
    的头像 发表于 12-30 09:48 ?452次阅读

    ADS1115返回值不连续是怎么回事?

    ADS1115返回值不连续,每次都是0.16.32.48......变化,不是0.1.2.3.4.....变化的,用逻辑分析仪看了读的是对的,求教!!!
    发表于 12-02 07:31

    ADS8332数据不刷新,每个通道返回值都是1.7V左右,而且会慢慢上升,为什么?

    ADS8332数据不刷新,每个通道返回值都是1.7V左右,而且会慢慢上升
    发表于 11-29 12:20

    同样是函数,在CC++中有什么区别

    同样是函数,在 CC++ 中有什么区别? 第一个返回值C语言
    的头像 发表于 11-29 10:25 ?954次阅读

    常用SQL函数及其用法

    的 SQL 函数及其用法: 一、聚合函数(Aggregate Functions) 聚合函数对一组执行计算,并返回单个
    的头像 发表于 11-19 10:18 ?1559次阅读

    C语言经典笔试题集锦

    有以下程序,如果 x 等于 254,则函数返回值是多少?
    的头像 发表于 11-09 11:39 ?600次阅读

    使用C语言实现函数模板

      用C语言能不能实现一个通用的函数,既能完成整数的相加,又能完成浮点数的相加?
    的头像 发表于 11-09 11:38 ?984次阅读

    HTTP相关返回值异常如何解决(下篇)

    ?今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中)一、4xx客户端错误状态码这些状态码表示请求有问题,通常是由于客户端的错误引起的。1.1 400 Bad Request: 请求格式
    的头像 发表于 10-24 17:24 ?1921次阅读
    HTTP相关<b class='flag-5'>返回值</b>异常如何解决(下篇)

    HTTP相关返回值异常如何解决(上篇)

    ? 今天我们讲讲HTTP相关返回值异常如何解决(实例持续更新中) HTTP介绍 HTTP(超文本传输协议,Hypertext Transfer Protocol)是用于在网络上进行数据交换的应用层
    的头像 发表于 10-20 16:40 ?1012次阅读
    HTTP相关<b class='flag-5'>返回值</b>异常如何解决(上篇)

    C语言指针详细解析

    ,所占的数据大小越大;字符指针是在文字常量区开辟了一段空间存放字符串,故字符指针是只想这个文字常量区的地址。 指针函数 指针函数就是一个返回值为指针的函数,指针
    发表于 09-14 10:03

    面试常考+1:函数指针与指针函数、数组指针与指针数组

    函数是指返回值为指针的函数。语法:返回值类型*函数名(参数列表)。示例代码:#include#includeint*getNumber(in
    的头像 发表于 08-10 08:11 ?1518次阅读
    面试常考+1:<b class='flag-5'>函数</b>指针与指针<b class='flag-5'>函数</b>、数组指针与指针数组

    PGA280发送指令后无返回值是怎么回事?

    在调试PGA280的时候,给PGA280的寄存器3”set BUF time-out”(如图)发送十六进制指令8300,本应该获得一个19的返回值,但我们却什么都没有收到,PGA280没有反应。 我们怀疑芯片因为供电的原因没有工作。 这是我们测试板的原理图 这是官
    发表于 08-07 06:12