爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      【C语言】函数——栈帧的创建和销毁

      首页 知识中心 软件开发 文章详情页

      【C语言】函数——栈帧的创建和销毁

      2023-07-26 08:11:29 阅读次数:421

      c语言,函数

      前言😄

      好的,各位,我们前面就已经学过函数的一些相关知识了,对函数也有了一定的了解,然后呢,今天我将通过这一篇博客给大家带来关于函数栈帧的创建和销毁的一些相关知识,让大家对于函数有更进一步的了解,增加自己的内在知识,提高自己的认知。提醒一下,本篇博客较为枯燥,请耐心食用!💖

      【C语言】函数——栈帧的创建和销毁


      🎬开始之前,仔细想想下面几个问题:

      局部变量是如何创建的?

       

      为什么局部变量不初始化内容是随机的?

       

      函数调用时参数时如何传递的?

       

      传参的顺序是怎样的?

       

      函数的形参和实参是什么关系?

       

      函数的返回值是如何带回的?

       

      如何理解"烫烫烫"的由来

      只要理解了函数栈帧的创建和销毁,以上问题就能够很好的理解了,这也是本篇博客的主要目的。

      下面我们要先来理解一些概念👇

      什么是栈🔑

      在学习C语言中,我们关注内存中的3个区域,栈区、堆区和静态区

      【C语言】函数——栈帧的创建和销毁

      那究竟什么是栈呢?⏩

      栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函 数,没有局部变量,也就没有我们如今看到的所有的计算机语言。

      在经典的计算机科学中,栈被定义为一种特殊的容器,用户可以将数据压入栈中(入栈,push),也可 以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出 栈(First In Last Out, FIFO)。就像叠成一叠的书,先叠上去的书在最下面,因此要最后才能取出。

      在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据 从栈顶弹出。压栈操作使得栈增大,而弹出操作使得栈减小。 在经典的操作系统中,栈总是向下增长(由高地址向低地址)的。 在我们常见的i386或者x86-64下,栈顶由成为 esp 的寄存器进行定位的。

      什么是函数的栈帧🔑

      函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,这些空间 是用来存放:

      函数参数和函数返回值

      临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)

      保存上下文信息(包括在函数调用前后需要保持不变的寄存器)。

      认识相关寄存器和汇编指令🔑

      寄存器🔥

      寄存器是计算机中尺寸最小、存储容量也最小(通常 4~8 个字节)、但读写效率最高的存储器,位于 CPU 内部。寄存器无法永久性地存储数据(属于易失性存储器),它的主要工作是暂时存储当前 CPU 正在处理的指令以及 CPU 将要使用的数据或者指令。

      相关寄存器介绍

      eax:通用寄存器,保留临时数据,常用于返回值

      ebx:通用寄存器,保留临时数据

      ebp:栈底寄存器

      esp:栈顶寄存器

      eip:指令寄存器,保存当前指令的下一条指令的地址

      小知识:

      1. 每一次函数调用,都要为本次函数调用开辟空间,就是函数栈帧的空间。

      2.这块空间的维护是使用了2个寄存器: esp 和 ebp , ebp 记录的是栈底的地址, esp 记录的是栈顶的地址。

      【C语言】函数——栈帧的创建和销毁

      相关的汇编指令:🔥

      mov:数据转移指令

       

      push:数据入栈,同时esp栈顶寄存器也要发生改变

       

      pop:数据弹出至指定位置,同时esp栈顶寄存器也要发生改变

       

      sub:减法命令

       

      add:加法命令

       

      call:函数调用,1. 压入返回地址 2. 转入目标函数

       

      jump:通过修改eip,转入目标函数,进行调用

       

      ret:恢复返回地址,压入eip,类似pop eip命令

       

      lea:传递地址指令,用于加载有效地址

      函数的调用堆栈🔑

      #include <stdio.h>
      int Add(int x, int y)
      {
      int z = 0;
      z = x + y;
      return z;
      }
      int main()
      {
      int a = 3;
      int b = 5;
      int ret = 0;
      ret = Add(a, b);
      printf("%d\n", ret);
      return 0;
      }

      【C语言】函数——栈帧的创建和销毁

      以上面代码为例子,进入调试,进入窗口,就可以开始调用堆栈了!

      注意:函数栈帧的创建和销毁过程,在不同的编译器上实现的方法大同小异。本篇博客基于VS2019编译器

      【C语言】函数——栈帧的创建和销毁

      我们可以看到, main 函数调用之前,是由 invoke_main 函数来调用main函数。那我们可以确定, invoke_main 函数应该会有自己的栈帧, main 函数和 Add 函数也会维护自己的栈 帧,每个函数栈帧都有自己的 ebp 和 esp 来维护栈帧空间。 那接下来我们从main函数的栈帧创建开始说起:👇

      函数栈帧的创建🔑

      调试到main函数开始执行的第一行,右击鼠标转到反汇编。

      【C语言】函数——栈帧的创建和销毁

      注意:VS编译器每次调试都会为程序重新分配内存,所以每次调试都会出现不同的情况!💨

      int main()
      {
      //函数栈帧的创建
      00BE1820 push ebp
      00BE1821 mov ebp,esp
      00BE1823 sub esp,0E4h
      00BE1829 push ebx
      00BE182A push esi
      00BE182B push edi
      00BE182C lea edi,[ebp-24h]
      00BE182F mov ecx,9
      00BE1834 mov eax,0CCCCCCCCh
      00BE1839 rep stos dword ptr es:[edi]
      //main函数中的核心代码
      int a = 3;
      00BE183B mov dword ptr [ebp-8],3
      int b = 5;
      00BE1842 mov dword ptr [ebp-14h],5
      int ret = 0;
      00BE1849 mov dword ptr [ebp-20h],0
      ret = Add(a, b);
      00BE1850 mov eax,dword ptr [ebp-14h]
      00BE1853 push eax
      00BE1854 mov ecx,dword ptr [ebp-8]
      00BE1857 push ecx
      00BE1858 call 00BE10B4
      00BE185D add esp,8
      00BE1860 mov dword ptr [ebp-20h],eax
      printf("%d\n", ret);
      00BE1863 mov eax,dword ptr [ebp-20h]
      00BE1866 push eax
      00BE1867 push 0BE7B30h
      00BE186C call 00BE10D2
      00BE1871 add esp,8
      return 0;
      00BE1874 xor eax,eax
      }
      这里看到 main 函数转化来的汇编代码如上所示。下面进行拆分:

      分析栈帧的创建:💧

      00BE1820 push ebp //把ebp寄存器中的值进行压栈,此时的ebp中存放的是invoke_main函数栈帧的ebp,esp-4
      00BE1821 mov ebp,esp //move指令会把esp的值存放到ebp中,相当于产生了main函数的ebp,这个值就是invoke_main函数栈帧的esp
      00BE1823 sub esp,0E4h //sub会让esp中的地址减去一个16进制数字0xe4,产生新的esp,此时的esp是main函数栈帧的esp,此时结合上一条指令的ebp和当前的esp,ebp和esp之间维护了一个块栈空间,这块栈空间就是为main函数开辟的,就是main函数的栈帧空间,这一段空间中将存储main函数中的局部变量,临时数据已经调试信息等。
      00BE1829 push ebx //将寄存器ebx的值压栈,esp-4
      00BE182A push esi //将寄存器esi的值压栈,esp-4
      00BE182B push edi //将寄存器edi的值压栈,esp-4
      //上面3条指令保存了3个寄存器的值在栈区,这3个寄存器的在函数随后执行中可能会被修改,所以先保存寄存器原来的值,以便在退出函数时恢复。
      //下面的代码是在初始化main函数的栈帧空间。
      //1. 先把ebp-24h的地址,放在edi中
      //2. 把9放在ecx中
      //3. 把0xCCCCCCCC放在eax中
      //4. 将从edp-0x2h到ebp这一段的内存的每个字节都初始化为0xCC
      00BE182C lea edi,[ebp-24h]
      00BE182F mov ecx,9
      00BE1834 mov eax,0CCCCCCCCh
      00BE1839 rep stos dword ptr es:[edi]
          

      看图理解一下过程:

      【C语言】函数——栈帧的创建和销毁

      刚开始,我们提到"烫烫烫"的由来:

      【C语言】函数——栈帧的创建和销毁

      为什么会出现“烫烫烫”:💧

      因为main函数调用时,在栈区开辟的空间的其中每一 个字节都被初始化为0xCC,而arr数组是一个未初始化的数组,恰好在这块空间上创建的,0xCCCC(两 个连续排列的0xCC)的汉字编码就是“烫”,所以0xCCCC被当作文本就是“烫”。

      分析main函数中的核心代码:💧

      int a = 3;
      00BE183B mov dword ptr [ebp-8],3 //将3存储到ebp-8的地址处,ebp-8的位置其实是a变量
      int b = 5;
      00BE1842 mov dword ptr [ebp-14h],5 //将5存储到ebp-14h的地址处,ebp-14h的位置其实是b变量
      int ret = 0;
      00BE1849 mov dword ptr [ebp-20h],0 //将0存储到ebp-20h的地址处,ebp-20h的位置其实是ret变量
      //以上汇编代码表示的变量a,b,ret的创建和初始化,这就是局部的变量的创建和初始化
      //其实是局部变量的创建时在局部变量所在函数的栈帧空间中创建的
      //调用Add函数
      ret = Add(a, b);
      //调用Add函数时的传参
      //其实传参就是把参数push到栈帧空间中
      00BE1850 mov eax,dword ptr [ebp-14h] //传递b,将ebp-14h处放的5放在eax寄存器中
      00BE1853 push eax //将eax的值压栈,esp-4
      00BE1854 mov ecx,dword ptr [ebp-8] //传递a,将ebp-8处放的3放在ecx寄存器中
      00BE1857 push ecx //将ecx的值压栈,esp-4
      //跳转调用函数
      00BE1858 call 00BE10B4
      00BE185D add esp,8
      00BE1860 mov dword ptr [ebp-20h],eax

      画图理解:

      【C语言】函数——栈帧的创建和销毁

      分析Add函数的传参💧

      //调用Add函数
      ret = Add(a, b);
      //调用Add函数时的传参
      //其实传参就是把参数push到栈帧空间中,这里就是函数传参
      00BE1850 mov eax,dword ptr [ebp-14h] //传递b,将ebp-14h处放的5放在eax寄存器
      中
      00BE1853 push eax //将eax的值压栈,esp-4
      00BE1854 mov ecx,dword ptr [ebp-8] //传递a,将ebp-8处放的3放在ecx寄存器中
      00BE1857 push ecx //将ecx的值压栈,esp-4
      //跳转调用函数
      00BE1858 call 00BE10B4
      00BE185D add esp,8
      00BE1860 mov dword ptr [ebp-20h],eax

      画图理解一下:

      【C语言】函数——栈帧的创建和销毁

      函数调用过程💧

      //跳转调用函数
      00BE1858 call 00BE10B4
      00BE185D add esp,8
      00BE1860 mov dword ptr [ebp-20h],eax

      call 指令是要执行函数调用逻辑的,在执行call指令之前先会把call指令的下一条指令的地址进行压栈 操作,这个操作是为了解决当函数调用结束后要回到call指令的下一条指令的地方,继续往后执行。

      【C语言】函数——栈帧的创建和销毁

      int Add(int x, int y)
      {
      00BE1760 push ebp //将main函数栈帧的ebp保存,esp-4
      00BE1761 mov ebp,esp //将main函数的esp赋值给新的ebp,ebp现在是Add函数的ebp
      00BE1763 sub esp,0CCh //给esp-0xCC,求出Add函数的esp
      00BE1769 push ebx //将ebx的值压栈,esp-4
      00BE176A push esi //将esi的值压栈,esp-4
      00BE176B push edi //将edi的值压栈,esp-4
      int z = 0;
      00BE176C mov dword ptr [ebp-8],0 //将0放在ebp-8的地址处,其实就是创建z
      z = x + y;
      //接下来计算的是x+y,结果保存到z中
      00BE1773 mov eax,dword ptr [ebp+8] //将ebp+8地址处的数字存储到eax中
      00BE1776 add eax,dword ptr [ebp+0Ch] //将ebp+12地址处的数字加到eax寄存中
      00BE1779 mov dword ptr [ebp-8],eax //将eax的结果保存到ebp-8的地址处,其实就是放到z中
      return z;
      00BE177C mov eax,dword ptr [ebp-8] //将ebp-8地址处的值放在eax中,其实就是把z的值存储到eax寄存器中,这里是想通过eax寄存器带回计算的结果,做函数的返回值。
      }
      00BE177F pop edi
      00BE1780 pop esi
      00BE1781 pop ebx
      00BE1782 mov esp,ebp
      00BE1784 pop ebp
      00BE1785 ret

      在Add函数中创建栈帧的方法和在main函数中是相似的,在栈帧空间的大小上略有差异而已。

      1. 将main函数的 ebp 压栈

      2. 计算新的 ebp 和 esp

      3. 将 ebx , esi , edi 寄存器的值保存

      4. 计算求和,在计算求和的时候,我们是通过 ebp 中的地址进行偏移访问到了函数调用前压栈进去的 参数,这就是形参访问。

      5. 将求出的和放在 eax 寄存器准备带回

      【C语言】函数——栈帧的创建和销毁

      图片中的 a' 和 b' 其实就是 Add 函数的形参 x , y 。这里的分析很好的说明了函数的传参过程,以及函数 在进行值传递调用的时候,形参其实是实参的一份拷贝。对形参的修改不会影响实参。

      函数栈帧的销毁下🔑

      00BE177F pop edi //在栈顶弹出一个值,存放到edi中,esp+4
      00BE1780 pop esi //在栈顶弹出一个值,存放到esi中,esp+4
      00BE1781 pop ebx //在栈顶弹出一个值,存放到ebx中,esp+4
      00BE1782 mov esp,ebp //再将Add函数的ebp的值赋值给esp,相当于回收了Add函数的栈
      帧空间
      00BE1784 pop ebp //弹出栈顶的值存放到ebp,栈顶此时的值恰好就是main函数的ebp,esp+4,此时恢复了main函数的栈帧维护,esp指向main函数栈帧的栈顶,ebp指向了main函数栈帧的栈底。
      00BE1785 ret //ret指令的执行,首先是从栈顶弹出一个值,此时栈顶的值就是call指令下一条指令的地址,此时esp+4,然后直接跳转到call指令下一条指令的地址处,继续往下执行。

      回到了call指令的下一条指令的地方:

      【C语言】函数——栈帧的创建和销毁

      但调用完Add函数,回到main函数的时候,继续往下执行,可以看到:

      00BE185D add esp,8 //esp直接+8,相当于跳过了main函数中压栈的a'和b'
      00BE1860 mov dword ptr [ebp-20h],eax //将eax中值,存档到ebp-0x20的地址处,其实就是存储到main函数中ret变量中,而此时eax中就是Add函数中计算的x和y的和,可以看出来,本次数的返回值是由eax寄存器带回来的。程序是在函数调用返回之后,在eax中去读取返回值的。

      结语✍

      局部变量是如何创建的?

      为函数分配好栈帧空间之后,栈帧空间初始化一部分之后,给局部变量在栈帧中分配空间,这就是局部变量的创建

      为什么局部变量不初始化内容是随机的?

      局部变量不初始化时,编译器在创建函数栈帧后会在栈帧空间里面放入一个值,而这个值是随机的

      如果给局部变量初始化时,会将随机值覆盖

      函数调用时参数时如何传递的?传参的顺序是怎样的?

      调用函数之前,就会把参数从右向左开始压栈,在Add函数栈帧里面通过指针的偏移量找回形参

      函数的形参和实参是什么关系?

      形参是实参的一份临时拷贝,值上相同,空间独立,改变形参不会影响实参

      函数的返回值是如何带回的?

      函数的返回值通过寄存器的方式带回

      如何理解"烫烫烫"的由来

      前面已经解释过了!

      好啦,时间过得真快啊,不知不觉前前后后又忙活了许久,又到了大半夜,本次博客就到这里结束了!感谢支持!🌹

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/weixin_60478154/article/details/124548388,作者:平凡的人1,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:【C++】简化源码——vector的模拟实现

      下一篇:【C++】内联函数&auto&范围for循环&nullptr

      相关文章

      2025-05-19 09:04:44

      js小题2:构造函数介绍与普通函数对比

      js小题2:构造函数介绍与普通函数对比

      2025-05-19 09:04:44
      new , 关键字 , 函数 , 对象 , 构造函数
      2025-05-19 09:04:30

      【Canvas技法】辐射式多道光影的实现

      【Canvas技法】辐射式多道光影的实现

      2025-05-19 09:04:30
      代码 , 函数 , 实现
      2025-05-19 09:04:22

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22
      使用 , 函数 , 初始化 , 定义 , 对象
      2025-05-19 09:04:14

      C语言字符函数和字符串函数--(超全超详细)

      C语言字符函数和字符串函数--(超全超详细)

      2025-05-19 09:04:14
      函数 , 字符 , 字符串
      2025-05-16 09:15:24

      如何将一串数字用函数的方法倒过来(C语言)

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24
      函数 , 数字 , 数组
      2025-05-14 10:33:31

      计算机小白的成长历程——习题演练(函数篇)

      计算机小白的成长历程——习题演练(函数篇)

      2025-05-14 10:33:31
      函数 , 字符串 , 数组 , 知识点 , 编写 , 迭代 , 递归
      2025-05-14 10:33:31

      【数据结构】第一章——绪论(2)

      【数据结构】第一章——绪论(2)

      2025-05-14 10:33:31
      函数 , 实现 , 打印 , 理解 , 算法 , 输入 , 输出
      2025-05-14 10:33:25

      30天拿下Rust之高级类型

      Rust作为一门系统编程语言,以其独特的内存管理方式和强大的类型系统著称。其中,高级类型的应用,为Rust的开发者提供了丰富的编程工具和手段,使得开发者可以更加灵活和高效地进行编程。

      2025-05-14 10:33:25
      Rust , type , 代码 , 函数 , 类型 , 返回
      2025-05-14 10:33:16

      30天拿下Python之文件操作

      Python是一种高级编程语言,它提供了许多内置函数和模块来处理文件操作,主要包括:打开文件、读取文件、写入文件、关闭文件、获取目录列表等。

      2025-05-14 10:33:16
      Python , 使用 , 函数 , 文件 , 权限 , 目录
      2025-05-14 10:33:16

      C++ 11新特性之tuple

      在C++编程语言的发展历程中,C++ 11标准引入了许多开创性的新特性,极大地提升了开发效率与代码质量。其中,tuple(元组)作为一种强大的容器类型,为处理多个不同类型的值提供了便捷的手段。

      2025-05-14 10:33:16
      std , 元素 , 函数 , 初始化 , 模板 , 类型
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5266583

      查看更多

      最新文章

      【Canvas技法】辐射式多道光影的实现

      2025-05-19 09:04:30

      外设驱动库开发笔记54:外设库驱动设计改进的思考

      2025-05-19 09:04:22

      C语言字符函数和字符串函数--(超全超详细)

      2025-05-19 09:04:14

      如何将一串数字用函数的方法倒过来(C语言)

      2025-05-16 09:15:24

      30天拿下Rust之高级类型

      2025-05-14 10:33:25

      C++ 11新特性之tuple

      2025-05-14 10:33:16

      查看更多

      热门文章

      Python 函数调用父类详解

      2023-04-23 09:44:31

      C语言结构体与结构体指针的使用

      2023-03-08 10:38:36

      指针(*)、取地址(&)、解引用(*)与引用(&)

      2023-04-10 08:54:19

      游戏编程之六 游戏编程的特点

      2024-09-25 10:13:46

      C#8.0新语法

      2023-02-07 10:34:04

      实现远程线程DLL注入

      2023-05-04 08:57:15

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      c语言模拟用户输入三次密码并判断是否正确

      JavaScrip的函数一点说明

      0010 找中间数 c语言

      【C语言】关键字的补充

      0022 c/c++语言 多个数求平均值

      golang里,结构体B里包含一个结构体A和一个整型成员变量。

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号