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

    文章

    7646

    浏览量

    146108
  • 函数
    +关注

    关注

    3

    文章

    4421

    浏览量

    67819

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    在Keil中进行C代码与汇编代码的混合编程

    1. 在 C 代码中调用汇编程序代码在 C 代码中调用汇编程序中函数的方法: 第一步,在 C 代码中声明函数的签名(包括
    发表于 01-23 06:36

    C语言回调函数原来这么简单

    函数指针:函数指针是指向函数的指针变量。简单理解是指向函数名的指针变量。 函数指针既然是指向函数
    发表于 12-30 06:45

    C语言中实现函数宏的三种方式

    (0) 不同的是,({}) 不能提前退出函数宏与支持返回值。({}) 毕竟不是 while 循环,不能直接使用 break退出函数宏是比较容易理解。那支持返回值是什么意思呢? 答案是
    发表于 12-29 07:34

    如何用好 C 语言函数返回值

    可能会比较复杂,不同的输入,常常产生不同的输出结果。 C语言函数返回值 C语言
    发表于 12-25 07:17

    C语言C++的区别及联系

    创建源文件时什么都不给,默认是.cpp。 3、返回值 C语言中,如果一个函数没有指定返回值类型,默认
    发表于 12-24 07:23

    函数指针及指针函数的区别

    指针的函数,即本质是一个函数函数返回类型是某一类型的指针   类型标识符 *函数名(参数表)   int *f(x,y);   首先它是一
    发表于 12-12 06:34

    函数指针的概念

    函数返回值类型 (* 指针变量名) (函数参数列表); “函数返回值类型”表示该指针变量可以指向具有什么
    发表于 12-11 08:10

    使用setjmp及longjmp函数处理异常

    ) { // 调用foo函数,传入一个非零 foo(10); // 调用foo函数,传入一个零 foo(0); } else { // 如果
    发表于 12-11 08:00

    检查函数返回值的错误和异常处理方法

    检查函数返回值:这是最常见也最基本的错误处理和异常处理方法,就是在调用一个函数后,检查其返回值
    发表于 12-11 06:48

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

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

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

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

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

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

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

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

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

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

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

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