在C中堆栈上的数据组织?

时间:2011-03-04 15:25:09

标签: c function

我正在学习C语言并且有一些问题。 当我们声明一个变量,如int i = 0 i 的地址是堆栈,对吧?

我想知道如何在内存中组织一个函数。例如,我有一个函数:

int myF() {
  int x = 2, y = 3;
  int z = x + y;
  return x;
}

如何在堆栈中组织此方法?我的意思是“ myF ”这个名字的内存地址和其他varialbes一样吗?并且“ myF ”应该有类似结束地址的内容,以指示函数结束的位置?

我错了吗?

非常感谢。

3 个答案:

答案 0 :(得分:1)

通常,函数的代码分别存储在只读存储器段中,而堆栈(“自动存储”)不与其重叠。此外,在编译期间消除了名称myF,该函数变为一段代码,从某个地址开始,以特殊处理器指令结束,表示“从当前函数返回”。

答案 1 :(得分:1)

图表将有助于说明它的组织方式:

Stack layout

  • 局部变量(例如示例中的i)可能在堆栈上,但它取决于编译器。典型的堆栈布局将显示局部变量区域,但是,例如,某些编译器可能会使用寄存器来代替变量。
  • 名称myF没有地址,但功能有。该地址通常位于可执行代码的单独区域中。
  • 没有“结束地址” - 而是由调用函数保存返回地址。当myF到达函数末尾并执行任何清理操作时,它将转移到返回地址。这实际上可能是一个问题,因为有一些漏洞试图改变这个返回地址并导致代码分支到恶意代码执行。

答案 2 :(得分:1)

  

我有堆栈中的地址,对吗?

不一定。

  

如何在堆栈中组织此方法?

答案是它取决于编译器和处理器架构。一些编译器在堆栈上存储局部变量。其他人将使用寄存器。

有关详细讨论,请查看此问题scope of variables