我在学C语言,有一些问题。
当我们声明像int i = 0这样的变量时。我的地址在堆栈中,对吧?
我想知道一个函数在内存中是如何组织的。例如,我有一个功能:

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

这个方法在堆栈中是如何组织的?我是说“myF”这个名字和其他变量一样有一个内存地址?“myF”应该有类似结束地址的东西来指示函数的结束位置?
我错了吗?
谢谢。

最佳答案

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

07-26 09:35