首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存:编译器如何选择存储变量的位置?

内存:编译器如何选择存储变量的位置?
EN

Stack Overflow用户
提问于 2014-12-09 23:15:34
回答 1查看 1.2K关注 0票数 3

给定两个函数,func1和f2,具有以下签名:

代码语言:javascript
复制
void func1(){
    int baba = 12345;
    // printf the value of baba here
}

void f2(){
    int loo;
    //printf the value of loo here
}

...if我运行了int,它只有func1,然后是f2:

代码语言:javascript
复制
int main(){
      func1();
      f2();
}

...then --阿里巴巴和卢布的印刷价值都是12345。因此,我的问题如下:

  1. 这是被定义的行为,还是我的机器所做的错误?
  2. 如果这不是我的计算机所做的错误,你能解释为什么编译器选择将loo存储在与baba?相同的地址中吗?

编辑:--我想我应该问,如果我有这两个函数,那么在任何一台机器上,巴巴和卢会有相同的值吗?

我知道卢布的价值是阿里巴巴的剩余价值的结果,我也知道(至少在我的机器上)两者的堆叠被布置得如此之多,以至于卢布重叠在阿里巴巴的旧领地上。难道每台机器都会把这两种功能叠加在一起,使阿里巴巴和卢布重叠吗?使用这两个函数与所写的完全相同,也就是说..。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-09 23:33:50

f2()中,lolo未初始化。因此,它的内容是未定义的

然而,大多数情况下,内容似乎是堆栈上的数据。巧合的是,您首先调用了func1(),它的内存/堆栈布局与f2()完全相同。因此,碰巧该变量包含以前存储在同一位置的数据。

这种行为根本不能得到保证。它只在这个特定的上下文中工作,因为在这两个调用之间没有创建其他局部变量,并且没有其他函数调用用其他内容覆盖数据(而且这两个函数的内存布局完全相同)。

这里有一张小图来解释这一具体情况:

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27390654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档