搜索
bottom↓
回复: 7

如果在函数中if分支里定义局部变量,会分配变量空间吗

[复制链接]

出0入0汤圆

发表于 2017-8-25 14:46:15 | 显示全部楼层 |阅读模式
大家好,我有一个关于C程序的基础问题需要解答:

  1. void Function(U8 a)
  2. {
  3.    U8 b;

  4.    if (State == TRUE)
  5.    {
  6.       U8 c;
  7.    }
  8.    else
  9.    {
  10.    }
  11. }
复制代码


如上函数:
1.如果if条件不满足的话,变量c还会创建吗?

2.如果问题1的答案为是,那么函数是否在进入时,不管如何,都会首先分配变量空间,然后再执行程序?

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2017-8-25 14:56:11 | 显示全部楼层
看编译器吧,应该都是会分配空间的

出0入8汤圆

发表于 2017-8-25 15:27:29 | 显示全部楼层
有用的分支,就要分配。

你自己写个代码,去看看对应的汇编实现,就知道是个怎样的情况。

出0入42汤圆

发表于 2017-8-25 15:41:31 | 显示全部楼层
在那个地方定义与你在开头定义的效果是一样的,进入函数时就会分配空间。

出0入0汤圆

发表于 2017-8-25 15:49:10 | 显示全部楼层
局部变量占用栈的空间

出0入0汤圆

发表于 2017-8-25 15:51:23 | 显示全部楼层
除非是预编译的条件判断,否则都会被分配空间

出0入0汤圆

发表于 2017-8-25 15:55:21 | 显示全部楼层
以下是我个人理解:

1,State是函数运行时得到的值(编译器在编译时根本不知道这个State最终的取值,所以局部变量c是肯定需要分配内存的)。

2, 分配这个内存是否一定需要用到栈(个人觉得)是不一定的,可能是直接使用通用寄存器(如果还有空闲通用寄存器的话)。

出300入477汤圆

发表于 2017-8-25 16:42:05 | 显示全部楼层
按照C语言的规定,只保证如果程序进入该分支,则这个变量肯定会被分配(可能分配在栈上,也可能是在寄存器)。
如果程序没有进入该分支,则这个变量的内存是否分配是不确定的,取决于编译器(也可能取决于编译器的设置,比如是不是开优化都可能不一样)。该问题无意义。
对C++,额外的保证是,如果程序没有进入该分支,即使这个变量一进函数就被分配了内存(这是合法的,而在进入if之后再分配内存也合法),也不能执行他的构造函数(如果他是个类变量,有自定义的构造函数的话)。
也就是说可以保证构造函数只有进入该分支的情况下才被执行。同样它的自定义析构函数也只有在进入该分支的情况下才被执行(如果它从来没有被构造出来过,那么当然也不该被析构)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-21 21:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表