加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C中函数和变量的内存分配

发布时间:2020-12-16 10:03:54 所属栏目:百科 来源:网络整理
导读:依赖于C编译器和编译器标志的版本,可以在函数中的任何位置初始化变量(据我所知). 我习惯将所有变量放在函数的顶部,但讨论开始时关于变量的内存使用,如果在函数的任何其他位置定义的话. 下面我写了两个简短的例子,我想知道是否有人能解释我(或验证)如何分配内
依赖于C编译器和编译器标志的版本,可以在函数中的任何位置初始化变量(据我所知).

我习惯将所有变量放在函数的顶部,但讨论开始时关于变量的内存使用,如果在函数的任何其他位置定义的话.

下面我写了两个简短的例子,我想知道是否有人能解释我(或验证)如何分配内存.

示例1:变量y是在可能的返回语句之后定义的,有可能这个变量不会被用于这个原因,据我所知这没关系,代码(内存分配)将是如果变量放在函数的顶部,则相同.它是否正确?

示例2:变量x在循环中初始化,这意味着此变量的范围仅在此循环内,但此变量的内存使用情况如何?如果放在功能的顶部会有什么不同吗?或者只是在函数调用的堆栈上初始化?

编辑:结束一个主要问题:
减少变量的范围或更改第一次使用的位置(所以在其他地方而不是顶部)是否会对内存使用产生任何影响?

代码示例1

static void Function(void){
 uint8_t x = 0;

 //code changing x
 if(x == 2)
 {
  return;
 }

 uint8_t y  = 0;    
 //more code changing y
}

代码示例2

static void LoopFunction(void){
 uint8_t i = 0;

 for(i =0; i < 100; i ++)
 {
  uint8_t x = i;
  // do some calculations
  uartTxLine("%d",x); 
 }

 //more code
}

解决方法

I’m used to put it all the variables at the top of the function

过去在旧版本的C中需要这样,但现代编译器放弃了这一要求.只要他们在第一次使用时知道变量的类型,编译器就会获得所需的所有信息.

I wondered if anyone could explain me how the memory gets allocated.

编译器决定如何在自动存储区域中分配内存.实现不仅限于为每个变量声明一个单独位置的方法.允许它们重用超出范围的变量的位置,以及在某个点之后不再使用的变量.

在第一个示例中,允许变量y使用以前由变量x占用的空间,因为y的第一个使用点是在x的最后一个使用点之后.

在第二个示例中,循环中用于x的空间可以重用于您可以在//更多代码区域中声明的其他变量.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读