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语言
    +关注

    关注

    183

    文章

    7642

    浏览量

    144632
  • 函数
    +关注

    关注

    3

    文章

    4406

    浏览量

    66850

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    请问C语言开发单片机为什么大多数都采用全局变量的形式?

    C语言代码,大多数都是使用全局变量,也就是用很多函数来操作这些变量,比如函数1把一个全局变量经过一系列复杂的算法计算后改变了这个全局变量的
    发表于 12-04 07:47

    语言模型如何处理上下文窗口中的输入

    本博客介绍了五个基本概念,阐述了大语言模型如何处理上下文窗口中的输入。通过明确的例子和实践中获得的见解,本文介绍了多个与上下文窗口有关的基本概念,如词元化、序列长度和注意力等。
    的头像 发表于 12-03 13:48 209次阅读
    大<b class='flag-5'>语言</b>模型如<b class='flag-5'>何处理</b>上下文窗口中的输入

    飞凌嵌入式ElfBoard-文件I/O的了解探究之返回错误处理与相关函数

    函数返回值描述段,如下所示,当函数返回错误时会设置errno:RETURN VALUE open(), openat(), and creat() return the new fil
    发表于 11-21 08:50

    如何获取易贝EBAY商品详情 API 返回值说明?

    的API获取商品详情时,通常会返回一个JSON或XML格式的响应,这个响应包含了商品的详细信息。以下是一个简化的JSON格式的eBay商品详情API返回值示例及说明:   json代码解读复制代码
    的头像 发表于 11-19 11:57 106次阅读

    如何获得速卖通aliexpress分类详情 API 返回值说明

    的API返回值会取决于你使用的API版本和请求类型。 以下是一个假设性的速卖通分类详情API返回值的说明,但请注意,这并非实际的API返回结构,因为速卖通的具体API文档可能不为公众公开。在实际开发中,你应当查阅速卖通官方的AP
    的头像 发表于 11-09 17:46 1023次阅读

    蜂鸟E203的GPIO读取的返回值注意事项

    蜂鸟E203使用Nuclei Studio开发,使用库函数中的gpio_read()读取IO口的输入时,当IO口是高电平时,使用函数所得到的返回值与IO口的编号存在一定的关系。 例如
    发表于 10-22 08:05

    使用jQuery的常用方法与返回值分析

    使用jQuery的常用方法与返回值分析 jQuery是一个轻量级的JavaScript库,旨在简化HTML文档遍历和操作、事件处理以及动画效果的创建。本文将介绍一些常用的jQuery方法及其返回值
    发表于 10-01 20:18

    C语言中的内联函数与宏

    C编程中,内联函数和宏都用于避免函数调用的开销并编写可复用的逻辑部分,但它们在工作方式和安全性方面存在显著差异。
    的头像 发表于 07-25 15:10 1724次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的内联<b class='flag-5'>函数</b>与宏

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

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

    cubeide中浮点函数返回值错误是怎么回事?

    我在某个.c文件中定义了一个float函数,在函数内设置断点查看return运算结果是正确的,但我在另一个.c文件中引用这个函数给某个变量赋
    发表于 03-13 07:45

    调用读命令CYPRESS_I2C_ReadI2C一直失败的原因?

    功,但调用读命令CYPRESS_I2C_ReadI2C 都失败了。如图2 图2 3----为了方便查看,我已在代码中加上打印查看返回值。QT环境中调用 Write 命令都是成功说明调用库成功了,但
    发表于 02-20 08:04

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

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

    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>

    请问LDC1314读出来的数据如何处理呢?数据与距离的关系函数如何确定?

    请问LDC1314读出来的数据如何处理呢?数据与距离的关系函数如何确定?自己测量找关系么??
    发表于 01-02 06:21

    C语言笔试题

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